缺乏背景下的叫我的路由时,我一直有缺失情况和nilClass错误的问题。在源代码中进行深入研究后,似乎generate_method调用基本上使用初始方法的块创建了一个新方法。工作围绕Sinatra的途径方法
get "/" do
@some_local_instance.do_something()
end
所以在上面的方法有很可能是该类称为some_local_instance内的局部变量,但是当死记硬背实际上是评估它没有上下文来定义的方法,其中,所以它会失败。
我之所以这样问是因为我的脚本的一部分,我有西纳特拉时加载哪个寄存器路线,当这些路由是我需要访问这些类的一些局部变量被加载外部类。一个例子是:
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!
原谅任何拼写/语法错误,这只是一个简单的例子,但你可以看到一个类注册路线,当这条路被击中返回该计算器的情况下产生一定的价值它在实例化时花费了。
问题我在这个例子中,当我尝试运行/添加路由时,它告诉我@calculator是一个nilClass,我相信这是Sinatra只需要代码块的方式上下文。对于任何简单的模板渲染来说,这似乎都很好,但是如果你需要做更多的事情,或者希望通过不使用静态和单例模块来保持代码模块化,你似乎没有办法解决这个问题......
我的假设在这里正确吗?如果是的话有没有什么办法让上下文感觉它逼着我写的不好,难以维护的代码,如果我有写的一切,静态和单身从路由交互。
== ==编辑
已经重构的问题和内容,以更准确地反映实际的问题,现在我有库的一个更稳固的理解。
通过源多一些期待之后,它似乎不只是复制和粘贴与使用define_method的新路径一起使用的方法。所以这个方法之外没有任何背景......这意味着唯一的解决办法就是将所有东西都变成静态的,这似乎是错误的......因为它很难以这种方式进行改变和测试......我可以完全虽然Ruby对我来说仍然是一种新语言,但它错误地做了什么。 – Grofit
一直试图使用常量对象模式来解决这个问题,但这仍然使事情真的很讨厌,因为一切都必须是静态的,这样才能工作...是否有一个原因,他们将方法体复制到一个新的方法所以它失去了所有的情况?因为我看不到任何好处,只是缺点...虽然我对此还是很陌生,因此可能无法完全理解某些需要这样做的复杂因素。我只能想到的一点是,方法主体对象可能被清除,或者方法可能在被调用之前被更新或从实例中取走,但看起来不太可能 – Grofit