Rails4:在使用rails引擎时将locale参数保留在根路由中

时间:2014-04-10 09:00:10

标签: ruby-on-rails-4 rails-routing rails-engines

当我使用带有区域设置参数的范围时:

MyApp::Application.routes.draw do
  scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
    resources :users
    ...
  end

  mount MyEngineApp::Engine => "/engineapp"

end

并在我的引擎中:

MyEngineApp::Engine.routes.draw do
  scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
    ...
  end
end

我有这样的网址:

http://domain.tld/en/users

http://domain.tld/engineapp/en

我想为我的引擎设置网址:

http://domain.tld/en/engineapp

我可以通过从引擎路由中删除范围并执行以下操作来完成此操作:

MyApp::Application.routes.draw do
  scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
    resources :users
    ...
     mount MyEngineApp::Engine => "/engineapp"
  end
end

但是,如果我这样做,我的链接看起来像:

http://domain.tld/en/engineapp?locale=fr

所以我的问题是,如何将引擎传递给引擎的根路由,因为我认为问题就在这里。

这是我的基础ApplicationController:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  # before_filter :set_default_url_options
  before_filter :set_locale


  def default_url_options(options={})
    {
      host:   Rails.application.config.action_mailer.default_url_options[:host],
      locale: I18n.locale
    }
  end

  protected

  def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
  end

end

我的Engine ApplicationController:

module MyEngineApp
  class ApplicationController < ::ApplicationController
    before_filter :authenticate_user!
  end
end

感谢的

1 个答案:

答案 0 :(得分:0)

它正在使用:

  def url_options(options={})
    {
      host:   Rails.application.config.action_mailer.default_url_options[:host],
      locale: I18n.locale
    }
  end

而不是default_url_options。