2011-01-06 11 views
12

Actualmente en mi aplicación tengo los conceptos de proyectos y usuarios. Ahora quiero implementar un alcance de cuenta para estos, de modo que tanto los proyectos como los usuarios pertenezcan a una cuenta en lugar de a nada en particular. Al hacer esto, me gustaría alcance mis rutas como esta:Implementación del alcance de la cuenta

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

Sin embargo, mediante la implementación de un enrutamiento scope con un parámetro llamado esto cambia cómo los ayudantes de enrutamiento realizan para que el ayudante project_path enrutamiento ahora espera dos parámetros, uno para el parámetro account_id y otro para el parámetro id, por lo que es algo como esto:

project_path(current_account, project) 

esta pequeña scope cambio me obliga a hacer masa ive cambios en la aplicación en los controladores y las vistas en las que utilizo estos ayudantes de ruta.

Seguramente, sin duda, seguramente, hay una manera limpia de hacerlo sin tener que cambiar todos y cada uno de los enrutadores en la aplicación.

Respuesta

13

Utilice los default_url_options picadillo para agregar un valor predeterminado para: 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 

continuación, puede utilizar el asistente de url con un solo parámetro:

project_path(project) 

puede anularla en una vista pasando: account_id como un parámetro hash a una ruta:

project_path(project, :account_id => other_account) 

Tenga en cuenta que esto no w ork en la consola.

+1

Esto funciona en los casos que he probado en, gracias! –

1

Desde Rails 3.0, la manipulación de parametros url es aún más simple con url_options:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

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