解决Sinatra路线方法缺乏背景的问题

Gro*_*fit 7 ruby webrick sinatra

在调用我的路由时,我遇到了丢失实例和nilClass错误的问题.在源代码中钻研之后,似乎generate_method调用基本上使用初始方法的块创建了一个新方法.

get "/" do
    @some_local_instance.do_something()
end
Run Code Online (Sandbox Code Playgroud)

所以在上面的方法中,很可能在该类中有一个名为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!
Run Code Online (Sandbox Code Playgroud)

原谅任何拼写/语法错误这只是一个简单的例子,但正如你可以看到一个类注册路由以及当该路由被命中时返回一个由实例化它的计算器实例生成的值.

我遇到的问题是,在这个例子中,当我尝试运行/ add路由时,它告诉我@calculator是一个nilClass,我相信它可以归结为Sinatra只是在没有上下文的情况下获取代码块的方式.对于任何简单的模板渲染来说这似乎都很好,但是如果你需要做更多花哨的事情,或者想通过不使用静态和单例来保持你的代码模块化,你似乎没有任何办法解决这个问题......

我的假设在这里是否正确?如果是这样的话,有任何方法可以保持上下文,因为如果我必须将所有东西都写成静态和单例以便从路径进行交互,那么它就会迫使我编写糟糕且难以维护的代码.

==编辑==

重新构建了问题和内容,以更准确地反映实际问题,现在我对库有了更深刻的理解.

Gro*_*fit 0

我可能不接受这个答案,但经过更多研究后,从维护的角度来看,在像 Ruby 这样的动态语言中,静态类可能并不是噩梦。

似乎大多数主要的 Ruby 库都针对静态实例(或常量)工作,这些实例先设置然后使用......这对我来说仍然有点奇怪,就像从数据库提供者的角度来看一样。只需调用数据库静态类并连接到数据库然后开始查询是非常容易的,但是如果您需要同时连接到 2 个单独的数据库怎么办?您需要不断地交换具有相同静态类的服务器,这会很麻烦。

无论如何看起来答案只是为你需要暴露给路由的所有内容设置一个常量,然后当你测试时只需将该常量设置为模拟。将这些东西称为 const 似乎仍然有点疯狂,但实际上它们并不是真正意义上的 const,因为它们可以随时更改......就像许多新的 Ruby 开发人员一样,这似乎令人困惑它(即 elsif、@@blah、定义其是否为 const 的变量大小写)。

正如我所说,如果其他人可以向我展示更好的模式,我不会接受这个答案,但目前会再给它几天时间。