解决Sinatra路由方法中缺乏上下文的问题 [英] Working around the lack of context in Sinatra's route methods

查看:18
本文介绍了解决Sinatra路由方法中缺乏上下文的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在调用路由时遇到了缺少实例和nilClass错误的问题。在深入研究源代码之后,似乎GENERATE_METHOD调用基本上使用初始方法的挡路创建了一个新方法。

get "/" do
    @some_local_instance.do_something()
end

因此,在上面的方法中,该类中很可能有一个名为SOME_LOCAL_INSTANCE的局部变量,但是当实际计算ROTER时,它没有关于该方法是在哪里定义的上下文,因此它将失败。

我问这个问题的原因是,作为脚本的一部分,我有一些外部类,这些类在加载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只是在没有上下文的情况下使用挡路代码。这对于任何简单的模板呈现似乎都很好,但是如果您需要做一些更奇特的事情,或者希望通过不使用静态和单例来保持代码的模块化,那么您似乎没有任何方法可以绕过这一点……

我的假设在这里是否正确?如果是这样的话,有没有办法保持上下文,因为如果我必须将所有东西都写成静态的和单例的,以便从一条路由进行交互,那么这感觉就像是迫使我编写糟糕而难以维护的代码。

==编辑==

我重新调整了问题和内容,以便更准确地反映实际问题,现在我对库有了更坚定的理解。

推荐答案

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

似乎大多数主要的Ruby库都是针对静电实例(或const)工作的,这些实例(或const)在安装后使用……从数据库提供商的角度来看,这在我看来仍然有点奇怪。只需调用您的数据库静电类并连接到您的数据库,然后开始查询是非常容易的,但是如果您需要同时连接到两个独立的数据库怎么办。您需要不断地交换具有相同静电类的服务器,这会很麻烦。

不管怎样,目前看起来的答案似乎是只需为您需要向路由公开的所有内容设置一个常量,然后在测试时只需将该常量设置为模拟即可。称这些东西为君主似乎仍然有点疯狂,而实际上他们并不是真正意义上的君主,因为他们可以随时改变……像许多新Ruby开发人员一样,它看起来只是为了它而令人困惑(即elsif,@@blah,可变大小写定义它是否为常量)。

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

这篇关于解决Sinatra路由方法中缺乏上下文的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆