2012-03-29 18 views
5

URL /パスヘルパーにデフォルト値を提供する方法はありますか?Railsルーティング:パスヘルパーのデフォルト値を与える

私は私のすべてのルートをラップアラウンドオプションのスコープを持っている:

#config/routes.rb 
Foo::Application.routes.draw do 

    scope "(:current_brand)", :constraints => { :current_brand => /(foo)|(bar)/ } do 
    # ... all other routes go here 
    end 

end 

私は、ユーザーがこれらのURLを使用してサイトにアクセスできるようにしたい:便宜上

/foo/some-place 
/bar/some-place 
/some-place 

を、私は私ApplicationController@current_brandを設定:だから

# app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    before_filter :set_brand 

    def set_brand                 
    if params.has_key?(:current_brand)           
     @current_brand = Brand.find_by_slug(params[:current_brand])    
    else                   
     @current_brand = Brand.find_by_slug('blah') 
    end 
    end 

end 

それほど良いですが、と*_urlの呼び出しを変更して、:current_brandパラメータを含めるようにする必要があります(オプションであっても)。これは本当に醜い、IMOです。

私はパスヘルパーを自動的に@current_brandでピックアップできるようにする方法はありますか?

おそらく、routes.rbに範囲を定義するより良い方法はありますか?

私はあなたがこのような何かをしたいだろうと思い

答えて

8

class ApplicationController < ActionController::Base 

    def url_options 
    { :current_brand => @current_brand }.merge(super) 
    end 

end 

このメソッドは毎回のURLが構築され、それの結果がパラメータにマージされて自動的に呼び出されます。

この詳細については、を見て:それはRSpecので動作するように取得するには、CMWの答えに加えてdefault_url_options and rails 3

+0

おかげでこのハックを追加しました。これが私が解決した解決策です。私たちには、これをメーラーで設定する必要がある、rspec(自分の答えで貼り付けたもの)で動作させるためのハックなど、たくさんの問題もあります。 – u2622

+0

ああ、はい、これを指摘してくれないのは残念です。あなたが完全性のためにそれを言いましたらうれしいです。 – CMW

5

、私はspec/support/default_url_options.rb

ActionDispatch::Routing::RouteSet.class_eval do 
    undef_method :default_url_options 
    def default_url_options(options={}) 
    { :current_brand => default_brand } 
    end 
end 
関連する問題