1

我刚刚开始使用 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

我怎样才能在不导致错误的情况下重构它

4

2 回答 2

2

据我所知,您不能在一个应用程序中使用两个(或更多)Sinatra 应用程序。由于两个文件都定义了Sinatra::Application后代,这是不可能的。

此外,如果您想使用params-hash 中的值,您应该定义帮助方法Helper Documentation,您在处理路由时调用它,或者您只需创建具有将参数值作为参数的类或实例方法的类。实际上从另一个文件/类调用参数似乎不是一个好习惯。

将其放在上下文中: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

实际代码当然取决于您要解决的实际问题,所以如果您能详细说明,我可能会更精确......

于 2012-07-04T18:30:16.043 回答
-1

错误消息包含您需要知道的所有内容,与 Sinatra 无关。

您需要 code1.rb,其中包含以下内容(稍作编辑以便运行):

require 'sinatra'

class App < Sinatra::Application
  if params['login']  # == 'login'
    pass = 'uampass'
  end
end

Ruby 在遇到代码时对其进行评估。在这种情况下,您需要“code1.rb”,因此它会评估该文件中的代码。它遇到“参数”并询问“是否有具有该名称的局部变量或方法?”。没有,所以正如你所见,它失败了。打开一个 irb 会话并检查它。

ruby 中的类定义只是一个具有范围的表达式。

与 Sinatra 相关:参数在路由声明采用的块中可用。

我建议阅读Sinatra: Up and Running,它解释了正在发生的一些“魔法”(Sinatra Book的好伴侣)。

于 2012-07-04T20:04:13.040 回答