Pasando parámetros en rieles redirect_to


202

¿Cómo pasamos parámetros en redirect_to en rails? Sé que podemos pasar la identificación usando esto:

redirect_to :action => action_name,:id => 3

Si quiero pasar parámetros adicionales como algunos datos de formulario, ¿cómo lograrlo?

EDITAR:

Para la sintaxis de Ruby 2, debe actualizar el fragmento anterior para:

redirect_to action: action_name, id: 3

3
¿Qué estás tratando de lograr realmente? ¿Has considerado guardar los datos en la sesión?
Michael Sepcot

1
Lo que está pidiendo no es posible: si está haciendo una redirección, debe ser una solicitud GET a la que está redirigiendo, por lo que los parámetros siempre estarán visibles para sus usuarios. En su lugar, debe almacenar cosas en la sesión.
GregT

Respuestas:


174

Solo agréguelas a las opciones:

redirect_to controller: 'thing', action: 'edit', id: 3, something: 'else'

Cedería /thing/3/edit?something=else


22
No puede redirigir con una POST. De los documentos HTTP 1.1 bajo las definiciones 3xx: "La acción requerida PUEDE ser realizada por el agente de usuario sin interacción con el usuario si y solo si el método utilizado en la segunda solicitud es GET o HEAD". Expande lo que realmente estás tratando de lograr y probablemente podamos empujarte en la dirección correcta.
jdl

Hola Muchas gracias por tu respuesta. Soy un novato en el desarrollo web. Estoy tratando de conocer diferentes formas de invocar una acción. Su respuesta ha aclarado muchas de mis dudas. Gracias de nuevo :))
markiv

Pulgares hacia arriba. He estado buscando esto desde hace 1 hora.

86

Si está utilizando recursos RESTful, puede hacer lo siguiente:

redirect_to action_name_resource_path(resource_object, param_1: 'value_1', param_2: 'value_2')

or
#You can also use the object_id instead of the object
redirect_to action_name_resource_path(resource_object_id, param_1: 'value_1', param_2: 'value_2')

or
#if its a collection action like index, you can omit the id as follows
redirect_to action_name_resource_path(param_1: 'value_1', param_2: 'value_2')

#An example with nested resource is as follows:
redirect_to edit_user_project_path(@user, @project, param_1: 'value_1', param_2: 'value_2')

46

Si tiene algunos datos de formulario, por ejemplo, enviados a la acción de inicio #, ahora desea redirigirlos a la acción de inicio mientras mantiene los parámetros, puede hacer esto

redirect_to act_house_path(request.parameters)


1
¿Sabes cómo combinarías esto, además de nuevos parámetros? es decir, request.parameters, (o +): this =>: that
Chris Edwards

55
Podrías usar el método de fusión. Por ejemplo:redirect_to act_house_path(request.parameters.merge(key: "value"))
GregT

3
También puede usar el método except para excluir los parámetros no deseados después de la fusión:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit)
Sr.

39

Puede pasar objetos arbitrarios a la plantilla con el parámetro flash.

 redirect_to :back, flash: {new_solution_errors: solution.errors}

Y luego acceda a ellos en la plantilla a través del hash.

<% flash[:new_solution_errors].each do |err| %>

63
Esta es una mala práctica. Este método hace un mal uso del objeto flash, está destinado a la mensajería del usuario. Mejor sería almacenar parámetros arbitrarios en la sesión y luego borrar esos parámetros de la sesión cuando haya terminado.
GregT


7
redirect_to :controller => "controller_name", :action => "action_name", :id => x.id

66
¿Puedes por favor dar alguna explicación más? Solo un ejemplo de código realmente no es suficiente.
simonmenke

7

Si está buscando una manera de pasar parámetros de URL adicionales (no controlador, acción, id, etc.), aquí hay un método sólido para hacerlo:

object_path(@object, params: request.query_parameters)

Eso transmitirá los parámetros utm o cualquier otro parámetro adicional que no desee perder.


4

routes.rb

 match 'controller_name/action_name' => 'controller_name#action_name', via: [:get, :post], :as => :abc

A continuación se detalla cualquier controlador que desee redirigir con parámetros:

redirect_to abc_path(@abc, id: @id), :notice => "message fine" 

3

Encamine su camino, tome el paramsy regrese:

redirect_to controller: "client", action: "get_name", params: request.query_parameters and return
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.