2012-05-27 14 views
55

La página de índice de Mis cuentas enumera todas las cuentas, y por cuenta tiene un enlace a "+ Servicio"; esto debería dirigir al usuario a la página/my_services/new y rellenar previamente el campo account_id con la ID correspondiente, según el enlace en el que se haya hecho clic en la página de índice de Cuentas.Rieles: paso de parámetros en el enlace a

Tengo depuración (params) en la parte inferior de cada página, y con lo que intento, no obtengo nada más que: controlador y: acción que aparece en mis parámetros para/my_services/nueva página .

El enlace que he estado tratando es la siguiente:

link_to "+ Service", "my_services/new", :account_id => acct.id 

Entonces también tengo la lógica en el controlador de servicios:

def new 
    @my_service = MyService.new 
    if params[:account_id] 
    @my_service.account_id = params[:account_id] 
    end 
end 

Puede alguien ayudar con la forma correcta de hacer esto? Todavía no he podido hacerlo funcionar con algunas cosas desagradables que probé.

EDITAR

Resulta que, si alguien está buscando en esta respuesta en el futuro, los recursos anidados (posiblemente con la opción shallow: true en routes.rb) parece ser el camino a seguir. Mi routes.rb para esta parte ahora se ve así:

resources :accounts, shallow: true do 
    resources :services 
end 

Mis enlaces ahora el siguiente aspecto:

<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id }) %> 

Respuesta

85

En primer lugar, es un ayudante link_to etiqueta html, su segundo argumento es la dirección URL, seguido de html_options. Lo que le gustaría es pasar account_id como un parámetro url a la ruta. Si ha configurado rutas con nombre correctamente en routes.rb, puede usar ayudantes de ruta.

link_to "+ Service", new_my_service_path(:account_id => acct.id) 

Creo que la mejor práctica es para pasar valores de modelo como un parámetro anidado dentro:

link_to "+ Service", new_my_service_path(:my_service => { :account_id => acct.id }) 

# my_services_controller.rb 
def new 
    @my_service = MyService.new(params[:my_service]) 
end 

y hay que controlar se permite que account_id de 'asignación de masas'. En los rieles 3 puede usar potentes controles para filtrar parámetros válidos dentro del controlador al que pertenece. Te lo recomiendo mucho.

http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods

También tenga en cuenta que si account_id no está establecido libremente por el usuario (por ejemplo, un usuario sólo puede enviar un servicio para la propia única account_id, entonces es mejor la práctica de no enviarlo a través de la solicitud, pero configurarlo dentro del controlador mediante la adición de algo como:

@my_service.account_id = current_user.account_id 

seguramente se pueden combinar los dos si únicamente permite a los usuarios crear un servicio por su propia cuenta, pero permitir administrador para crear cualquier persona es mediante el uso de papeles en attr_accessible.

esperanza esto ayuda

+0

me pregunto si esto funcionará link_to "servicio", "? My_services/nueva account_id =" + acct.id –

1
link_to "+ Service", controller_action_path(:account_id => acct.id) 

Si sigue sin funcionar comprobar la ruta:

$ rake routes 
Cuestiones relacionadas