[英]How can I refactor my Sinatra app?
我刚刚开始使用sinatra编写一个相当简单的网站。 我的问题是我想重构主app.rb文件,但是在尝试访问url参数时遇到错误。
在我的get'/'操作中,Sinatra正在查看设置了哪些参数,然后需要根据URL中的内容执行一些不同的操作。 这样的事情。
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
问题是我需要一个也使用参数的文件。
我在上面的代码中添加了以下内容:
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
我该如何重构而不引起错误
据我所知,您不能在其中使用两个(或多个)Sinatra应用程序,以及一个应用程序。 由于两个文件都定义了Sinatra::Application
后代,所以这是不可能的。
另外,如果要使用params
-hash中的值,则应定义帮助程序方法Helper Documentation ,在处理路由时调用该文件,或者仅创建具有将params-values作为参数的类或实例方法的Class。 实际上,从另一个文件/类调用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
实际的代码当然取决于您要解决的实际问题,因此,如果您详细说明一下,我可能会更精确...
该错误消息包含您需要了解的所有内容,并且与Sinatra无关。
您需要code1.rb,其中包含以下内容(稍作编辑,它将运行):
require 'sinatra'
class App < Sinatra::Application
if params['login'] # == 'login'
pass = 'uampass'
end
end
Ruby会在遇到代码时对其进行评估。 在这种情况下,您需要“ code1.rb”,因此它将评估该文件中的代码。 它遇到“参数”,并询问“是否存在具有该名称的局部变量或方法?”。 没有,所以正如您所见,它失败了。 打开一个irb会话并签出。
ruby中的类定义只是一个带作用域的表达式。
关于Sinatra:在路线声明所采用的代码块中可以使用params。
我建议阅读《 Sinatra:启动和运行》 ,其中解释了一些正在发生的“魔术”( Sinatra Book的一个很好的伴侣)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.