6

次のルートが設定されています。

MyApp::Application.routes.draw do
  scope "/:locale" do    
    ...other routes
    root :to => 'home#index'
  end
  root :to => 'application#detect_language'
end

これにより、次のようになります。

root      /:locale(.:format)    home#index
root      /                     application#detect_language

これは問題ありません。

ただし、ロケールでルートを生成したい場合、問題が発生します。

root_path/どちらが正しいかを生成します。

root_path(:locale => :en)/?locale=en望ましくないものを生成します-私たちは欲しいです/en

それで、質問は、これは可能ですか、そしてどのように可能ですか?

4

1 に答える 1

10

root メソッドはデフォルトで最上位 / ルートを定義するために使用されます。したがって、同じルートを 2 回定義しているため、2 番目の定義が最初の定義を上書きします!

root メソッドの定義は次のとおりです。

def root(options = {})
  options = { :to => options } if options.is_a?(String)
  match '/', { :as => :root, :via => :get }.merge(options)
end

名前付きルートとして :root を使用していることは明らかです。root メソッドを使用する場合は、必要なパラメーターをオーバーライドするだけです。例えば

scope "/:locale" do    
  ...other routes
  root :to => 'home#index', :as => :root_with_locale
end
root :to => 'application#detect_language'

これを次のように呼び出します。

root_with_locale_path(:locale => :en)

だから、これはバグではありません!

于 2012-08-09T12:53:32.437 に答える