2

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

--- mainapp.rb ---

#config
require './redirector.rb'

get '/' do
   Redirector::redirect_to_stackoverflow
end

--- 重定向器.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

怎么了?有没有我没有正确要求的地方?

4

2 回答 2

2

redirect对模块内部的调用Redirector被发送到RedirectorModule 对象,其中该方法不存在。require 'sinatra'insidemodule Redirector不是必需的,也不做任何一种方法组合。

您可能可以将Sinatra 方法组合到您的 Redirector 模块中,但这不是正常的做法。通常情况正好相反——您编写“帮助”模块,这些模块以各种方式组合到您的 Sinatra 应用程序中。

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

应用程序.rb

require 'sinatra'
require_relative 'redirect.rb'

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

重定向.rb

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

配置.ru

require File.dirname(__FILE__) + "/app.rb"
run MyApp
于 2013-06-27T16:45:18.397 回答
2

@Neil Slater 的解释是正确的,但我建议您也将其设为Sinatra 扩展,例如

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
于 2013-06-28T12:57:04.813 回答