如何在Rack语句中初始化变量?

时间:2011-02-21 21:33:05

标签: ruby-on-rails ruby ruby-on-rails-3 rack

我正在使用Ruby on Rails 3,我正在尝试使用Rack。由于我不是这方面的专家,我想知道一些事情。

以下代码来自here

require 'rack'

class Rack::ForceDomain
  def initialize(app, domain)
    @app = app
    @domain = domain
  end

  def call(env)
    request = Rack::Request.new(env)
    if @domain and request.host != @domain
      fake_request = Rack::Request.new(env.merge("HTTP_HOST" => @domain))
      Rack::Response.new([], 301, "Location" => fake_request.url).finish
    else
      @app.call(env)
    end
  end
end
  • 什么是变量app以及检索其值的位置?

  • domain方法中传递initialize变量的位置和方式

1 个答案:

答案 0 :(得分:2)

Rack是一个中间件,用于将更高级别的应用程序(如rails)连接到网络服务器(如mongrel)。在rails中,您可以使用以下命令来使用此代码:

# config.middleware.use "Rack::ForceDomain", "mydomain.com"

App是对Rails实例的引用。域名是由您获得该代码的人添加的,它不是标准的Rack初始化。

尽管如此,您无需为了正在进行的操作而进入机架级别。我个人更喜欢通过nginx进行重写,但你可以在rails 3中进行重写。

在config / routes.rb文件中:

    constraints(:host => /example.com/) do
      root :to => redirect("http://www.example.com")
      match '/*path', :to => redirect {|params| "http://www.example.com/#{params[:path]}"}
    end

这是http://railsdog.com/blog/2010/10/29/redirect-non-www-requests-the-rails3-way/