2011-01-06 2 views
12

Attualmente nella mia applicazione ho i concetti di progetti e utenti. Ora voglio implementare un ambito di account per questi in modo che sia i progetti che gli utenti appartengano a un account piuttosto che a nulla in particolare. In questo modo, vorrei portata miei percorsi come questo:Implementazione dell'ambito dell'account

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

Tuttavia, mediante l'attuazione di un instradamento scope con un parametro denominato questo cambia come gli aiutanti di routing eseguono in modo che l'aiutante project_path instradamento ora si aspetta due parametri, uno per il parametro account_id e uno per il parametro id, rendendolo qualcosa di simile:

project_path(current_account, project) 

questo piccoloscope cambiamento mi obbliga a fare di massa Ive modifiche attraverso l'applicazione nei controller e viste in cui utilizzo questi helper dei percorsi.

Sicuramente, sicuramente, sicuramente, c'è un modo pulito per farlo senza dover cambiare ogni singolo helper di routing nell'applicazione?

risposta

13

Utilizzare i default_url_options hash per aggiungere un valore predefinito per: 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 

è possibile utilizzare l'helper URL con un solo parametro:

project_path(project) 

è possibile ignorare in una vista passando: account_id come parametro hash a una route:

project_path(project, :account_id => other_account) 

Si noti che questo non sarà ork nella console.

+1

Questo funziona nei casi che ho provato in, grazie! –

1

Dal Rails 3.0, manipolando url params è ancora più semplice con url_options:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

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