Как инициализировать переменные в операторе Rack? - PullRequest
1 голос
/ 22 февраля 2011

Я использую Ruby on Rails 3 и пытаюсь использовать Rack. Поскольку я не являюсь экспертом в этом вопросе, я хотел бы узнать кое-что об этом.

Следующий код от здесь .

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 Ответ

2 голосов
/ 22 февраля 2011

Rack - это промежуточное программное обеспечение для интерфейса приложения более высокого уровня (например, рельсы) с веб-сервером (например, монгрел).В rails вы можете заставить этот код работать, используя:

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

Приложение является ссылкой на экземпляр Rails.Домен добавлен человеком, от которого вы получили этот код, это не стандартная инициализация Rack.

Вам не нужно переходить на уровень стойки для того, что вы делаете для этого.Лично я предпочитаю делать перезапись через nginx, но вы можете сделать это в rails 3.

В вашем файле config / rout.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/

...