我有一个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
有什么问题?有没有我没有正确要求的地方?
答案 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