在调用我的路线时,我一直遇到缺少实例和 nilClass 错误的问题。在深入研究源代码之后,似乎generate_method调用基本上使用初始方法的块创建了一个新方法。
get "/" do
@some_local_instance.do_something()
end
因此,在上面的方法中,该类中很可能有一个名为 some_local_instance 的局部变量,但是当实际评估死记硬背时,它没有关于定义该方法的位置的上下文,因此它将失败。
我问的原因是因为作为我的脚本的一部分,我有外部类,这些外部类在加载 Sinatra 时加载,这些类注册了路由,并且当调用这些路由时,我需要访问这些类上的一些局部变量。一个例子是:
class SomeRouteClass
def initialize(sinatra, calculator)
@calculator = calculator
@sinatra = sinatra
end
def setup_routes
@sinatra.get "/add" do
return @calculator.add(1,1)
end
end
end
class Calculator
def add(a,b)
return a+b;
end
end
sinatra = Sinatra.new
calculator = Calculator.new
routing_class = SomeRouteClass.new(sinatra, calculator)
routing_class.setup_routes
sinatra.run!
请原谅任何拼写/语法错误,这只是一个简单的示例,但是正如您所看到的,一个类注册了路由,并且当该路由被命中时,会返回实例化时所采用的计算器实例生成的一些值。
我遇到的问题是,在这个例子中,当我尝试运行 /add 路由时,它告诉我 @calculator 是一个 nilClass,我相信这取决于 Sinatra 只获取没有上下文的代码块的方式。这对于任何简单的模板渲染来说似乎都很好,但是如果您需要做任何更奇特的事情,或者想要通过不使用静态和单例来保持代码模块化,您似乎没有任何办法解决这个问题...
我的假设在这里正确吗?如果是这样,有什么方法可以保留上下文,因为如果我必须将所有内容都编写为静态和单例才能从路由进行交互,那么这感觉就像迫使我编写糟糕且难以维护的代码。
==编辑==
现在我对图书馆有了更坚定的了解,已经重新调整了问题和内容,以更准确地反映实际问题。