Sinatra命令在模块中不起作用

时间:2013-06-27 16:08:57

标签: ruby sinatra

我有一个Sinatra应用程序,需要一个不同文件中的模块。当我在该模块中使用Sinatra命令时(例如redirect "http://facebook.com"),我得到NoMethodError。为了说明这个问题,我制作了一个简化版本:

--- mainapp.rb ---

#config
require './redirector.rb'

get '/' do
   Redirector::redirect_to_stackoverflow
end

--- redirector.rb ---

module Redirector
  require 'sinatra'

  def self.redirect_to_stackoverflow
    redirect "http://stackoverflow.com"
  end
end

--- config.ru ---

require 'rubygems'
require 'sinatra'
require File.dirname(__FILE__) + "/ptt.rb"

run Sinatra::Application

有什么问题?有没有我没有正确要求的地方?

2 个答案:

答案 0 :(得分:2)

redirect模块内对Redirector的调用将发送到Redirector模块对象,该方法不存在。 require 'sinatra'内的module Redirector不是必需的,也不做任何方法组合。

您可能可以将Sinatra方法组合到您的重定向器模块中,但这不是正常做法。通常情况就是这样 - 您可以通过各种方式编写“助手”模块,这些模块由Sinatra应用程序组成。

这是一个类似的示例应用程序,采用更常用的合成方法:

<强> app.rb

require 'sinatra'
require_relative 'redirect.rb'

class MyApp < Sinatra::Application
   include Redirector
   get '/' do
      redirect_to_stackoverflow
   end
end

<强> redirect.rb

module Redirector
  def redirect_to_stackoverflow
    redirect "http://stackoverflow.com"
  end
end

<强> config.ru

require File.dirname(__FILE__) + "/app.rb"
run MyApp

答案 1 :(得分:2)

@Neil Slater的解释是正确的,但我建议你也把它变成Sinatra extension,例如

require 'sinatra/base'

module Sinatra
  module Redirector
    def redirect_to_stackoverflow
      redirect "http://stackoverflow.com"
    end
  end
  helpers Redirector
end

然后(对于经典应用),您需要做的就是require它。

require 'sinatra/redirector'
get "/" do
  redirect_to_stackoverflow
end