2011-01-06 9 views
12

現在、私のアプリケーションでは、プロジェクトとユーザーの概念があります。今私は、プロジェクトとユーザーの両方が特に何もするのではなく、アカウントに属するように、これらのアカウントのスコープを実装したいと思います。これにより、私は、スコープに、このような私のルートを希望:アカウントスコープの実装

scope ":account_id" do 
    resources :projects 
    ... 
end 

しかし、これはproject_pathルーティングヘルパーは、現在2つのパラメータを期待しているように、ルーティングヘルパーが行う方法を変更という名前のパラメータを使用してルーティングscopeを実装することにより、

project_path(current_account, project) 

この小さなscope変更が塊を作るために私を必要とします。それをこのような何かを作るaccount_idパラメータ用とidパラメータの1、これらのパスヘルパーを使用するコントローラとビューで、アプリケーション全体で変更されたのはです。

確かに、確かに、アプリケーション内のすべての単一のルーティングヘルパーを変更することなく、これを行うためのきれいな方法がありますか?

答えて

13

のデフォルト値を追加するハッシュdefault_url_optionsを使用します。ACCOUNT_IDを:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    before_filter :set_default_account_id 

    def set_default_account_id 
    self.default_url_options[:account_id] = current_account 
    end 
end 

あなたは、単一のパラメータでURLヘルパーを使用することができます。

project_path(project) 

あなたはビューでそれを上書きすることができますハッシュパラメータとしてaccount_idをルートに渡します。

project_path(project, :account_id => other_account) 

これはコンソールのork。

+1

これは私が、おかげでそれを試してみた場合に動作します! –

1

のRails 3.0以降、URL paramsはを操作することurl_optionsとさらに簡単です:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    def url_options 
    { account_id: current_account.id }.merge(super) 
    end 
end