Passage de paramètres dans les rails redirect_to

202

Comment passons-nous les paramètres de redirect_to dans les rails? Je sais que nous pouvons transmettre id en utilisant ceci:

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

Si je veux transmettre des paramètres supplémentaires comme certaines données de formulaire, comment y parvenir?

ÉDITER:

Pour la syntaxe Ruby 2, vous devez mettre à jour l'extrait ci-dessus pour:

redirect_to action: action_name, id: 3
markiv
la source
3
Qu'essayez-vous réellement d'accomplir? Avez-vous envisagé d'enregistrer les données dans la session?
Michael Sepcot
1
Ce que vous demandez n'est pas possible - si vous effectuez une redirection, ce doit être une demande GET vers laquelle vous redirigez, de sorte que les paramètres seront toujours visibles pour vos utilisateurs. Vous devez plutôt stocker des éléments dans la session.
GregT

Réponses:

174

Ajoutez-les simplement aux options:

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

Donnerait /thing/3/edit?something=else

Michael Sepcot
la source
22
Vous ne pouvez pas rediriger avec un POST. À partir des documents HTTP 1.1 sous les définitions 3xx: "L'action requise PEUT être effectuée par l'agent utilisateur sans interaction avec l'utilisateur si et seulement si la méthode utilisée dans la deuxième demande est GET ou HEAD." Développez ce que vous essayez vraiment d'accomplir et nous pouvons probablement vous pousser dans la bonne direction.
jdl
Salut Merci beaucoup pour votre réponse. Je suis un débutant dans le développement web. J'essaie de connaître différentes façons d'invoquer une action. Votre réponse a clarifié beaucoup de mes doutes. Merci encore :))
Markiv
Pouces vers le haut. Je le cherche depuis 1 heure.
86

Si vous utilisez des ressources RESTful, vous pouvez effectuer les opérations suivantes:

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')
Sohan
la source
46

Si vous avez des données de formulaire par exemple envoyées à home # action, maintenant vous voulez les rediriger vers house # act tout en conservant les paramètres, vous pouvez le faire

redirect_to act_house_path(request.parameters)

v4r
la source
1
Savez-vous comment combiner cela, ainsi que de nouveaux paramètres? ie request.parameters, (ou +): this =>: that
Chris Edwards
5
Vous pouvez utiliser la méthode de fusion. Par exemple:redirect_to act_house_path(request.parameters.merge(key: "value"))
GregT
3
Vous pouvez également utiliser la méthode except pour exclure les paramètres indésirables après la fusion:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit)
mr io
39

Vous pouvez passer des objets arbitraires au modèle avec le paramètre flash.

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

Et puis accédez-y dans le modèle via le hachage.

<% flash[:new_solution_errors].each do |err| %>
vermasque
la source
63
C'est une mauvaise pratique. Cette méthode abuse de l'objet flash, destiné à la messagerie utilisateur. Il serait préférable de stocker des paramètres arbitraires dans la session, puis d'effacer ces paramètres de la session lorsque vous avez terminé.
GregT
30
redirect_to new_user_path(:id => 1, :contact_id => 3, :name => 'suleman')
Muhammad Suleman
la source
7
redirect_to :controller => "controller_name", :action => "action_name", :id => x.id
Karwin
la source
6
Pouvez-vous s'il vous plaît fournir quelques explications supplémentaires. Un simple exemple de code ne suffit vraiment pas.
simonmenke
7

Si vous cherchez un moyen de transmettre des paramètres d'URL supplémentaires (pas le contrôleur, l'action, l'id, etc.), voici une méthode robuste pour le faire:

object_path(@object, params: request.query_parameters)

Cela transmettra les paramètres utm ou tout autre paramètre supplémentaire que vous ne voudrez pas perdre.

Abram
la source
4

routes.rb

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

Tout contrôleur que vous souhaitez rediriger avec des paramètres est indiqué ci-dessous:

redirect_to abc_path(@abc, id: @id), :notice => "message fine" 
Mitesh Sharma
la source
3

Parcourez votre chemin, prenez le params, et revenez:

redirect_to controller: "client", action: "get_name", params: request.query_parameters and return
Darlan Dieterich
la source