我刚刚开始使用sinatra编写一个相当简单的网站。我的问题是我想重构主app.rb文件,但是在尝试访问url params时遇到错误。
在我的'/'动作中,Sinatra正在查看哪些参数设置然后根据网址中的内容需要做一些不同的事情。这样的事情。
class App < Sinatra::Application
...
get '/' do
if params['code1']
@network = 'code1'
mode code here
elsif params['called'] && params['mac']
@network = 'code2'
mode code here
elsif params['code3']
@network = 'code3'
mode code here
end
end
问题是我需要一个同样使用params的文件。
我在上面的代码中添加了以下内容:
require File.dirname(__FILE__) + '/lib/networks/code1.rb'
code1.rb包括:
class App < Sinatra::Application
if params['login'] # == 'login'
pass = 'uampass'
elsif
...
但是这给了我以下错误:
undefined local variable or method `params' for main:Object
如何在不导致错误的情况下重构此内容
答案 0 :(得分:2)
据我所知,你不能在一个应用程序中使用两个(或更多)Sinatra应用程序。由于两个文件都定义了Sinatra::Application
后代,因此这是不可能的。
另外,如果你想使用params
- hash中的值,你应该定义在处理路由时调用的辅助方法Helper Documentation,或者你只创建具有类或实例方法的类,将params-values作为参数。实际上从另一个文件/类中调用params似乎不是一个好习惯。
将此置于上下文中:Sinatra应用程序被组织为处理程序。 Sinatra::Application
后代类似于主处理程序,它使用支持方法(Sinatra::Application
后代的帮助程序和实例方法)或支持类,通常在其他文件中定义,但不从Sinatra::Application
下降。
为了更清楚地说明这一点:
您的主 Sinatra文件:
require_relative 'another_file.rb'
class App < Sinatra::Application
# ...
@a_handler = MyHandler.new
get '/' do
if params['something'] == 'wanted_value'
@a_handler.handle_it(params)
end
end
另一个文件('another_file.rb'):
class MyHandler
def initialize
@an_instance_variable = 'foobar'
end
def handle_it(params_hash)
if params_hash['login'] # == 'login'
pass = 'uampass'
elsif
# ...
end
# ...
# do some stuff
# ....
return pass
end
end
实际代码当然取决于你要解决的实际问题,所以如果你要详细说明我可能会更精确......
答案 1 :(得分:-1)
错误消息包含您需要知道的所有内容,而且与Sinatra无关。
您需要code1.rb,其中包含此内容(稍加编辑以便运行):
require 'sinatra'
class App < Sinatra::Application
if params['login'] # == 'login'
pass = 'uampass'
end
end
Ruby会在遇到代码时对其进行评估。在这种情况下,您需要'code1.rb',因此它会评估该文件中的代码。它遇到'params'并询问“是否有一个带有该名称的局部变量或方法?”。没有,所以它失败了,你已经看到了。打开一个irb会话并查看它。
ruby中的类定义只是一个带范围的表达式。
关于Sinatra:params在路径声明所用的块中可用。
我建议阅读Sinatra: Up and Running,它解释了正在发生的一些“魔法”(Sinatra Book的良好伴侣)。