繁体   English   中英

如何重构我的Sinatra应用程序?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM