Übergeben von Parametern in Rails redirect_to


201

Wie übergeben wir Parameter in redirect_to in Rails? Ich weiß, dass wir die ID damit übergeben können:

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

Wenn ich zusätzliche Parameter wie einige Formulardaten übergeben möchte, wie kann ich dies erreichen?

BEARBEITEN:

Für die Ruby 2-Syntax müssen Sie das obige Snippet auf Folgendes aktualisieren:

redirect_to action: action_name, id: 3

3
Was versuchst du eigentlich zu erreichen? Haben Sie darüber nachgedacht, die Daten in der Sitzung zu speichern?
Michael Sepcot

1
Was Sie verlangen, ist nicht möglich. Wenn Sie eine Umleitung durchführen, muss es sich um eine GET-Anforderung handeln, zu der Sie umleiten, damit die Parameter für Ihre Benutzer immer sichtbar sind. Sie sollten stattdessen Inhalte in der Sitzung speichern.
GregT

Antworten:


174

Fügen Sie sie einfach den Optionen hinzu:

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

Ergäbe /thing/3/edit?something=else


22
Sie können nicht mit einem POST umleiten. Aus den HTTP 1.1-Dokumenten unter den 3xx-Definitionen: "Die erforderliche Aktion kann vom Benutzeragenten ohne Interaktion mit dem Benutzer ausgeführt werden, wenn und nur wenn die in der zweiten Anforderung verwendete Methode GET oder HEAD ist." Erweitern Sie das, was Sie wirklich erreichen möchten, und wir können Sie wahrscheinlich in die richtige Richtung lenken.
JDL

Hallo, vielen Dank für Ihre Antwort. Ich bin ein Neuling in der Webentwicklung. Ich versuche verschiedene Möglichkeiten zu kennen, um eine Aktion aufzurufen. Ihre Antwort hat viele meiner Zweifel geklärt.
Nochmals vielen

Daumen hoch. Ich habe seit 1 Stunde danach gesucht.

86

Wenn Sie RESTful-Ressourcen verwenden, können Sie Folgendes tun:

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

Wenn Sie beispielsweise einige Formulardaten an home # action gesendet haben, möchten Sie diese jetzt unter Beibehaltung der Parameter an house # act umleiten. Dies können Sie tun

redirect_to act_house_path(request.parameters)


1
Wissen Sie, wie Sie dies und neue Parameter kombinieren würden? dh request.parameters, (oder +): this =>: that
Chris Edwards

5
Sie können die Zusammenführungsmethode verwenden. Zum Beispiel:redirect_to act_house_path(request.parameters.merge(key: "value"))
GregT

3
Sie können auch die Ausnahme-Methode verwenden, um unerwünschte Parameter nach dem Zusammenführen auszuschließen:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit)
Herr Io

39

Mit dem Parameter flash können Sie beliebige Objekte an die Vorlage übergeben.

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

Und dann greifen Sie in der Vorlage über den Hash darauf zu.

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

63
Das ist schlechte Praxis. Diese Methode missbraucht das Flash-Objekt, das für Benutzermeldungen vorgesehen ist. Besser wäre es, beliebige Parameter in der Sitzung zu speichern und diese Parameter dann aus der Sitzung zu löschen, wenn Sie fertig sind.
GregT


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

6
Können Sie bitte weitere Erklärungen abgeben? Nur ein Codebeispiel reicht wirklich nicht aus.
Simonmenke

7

Wenn Sie nach einer Möglichkeit suchen, zusätzliche URL-Parameter (nicht Controller, Aktion, ID usw.) zu übergeben, finden Sie hier eine robuste Methode:

object_path(@object, params: request.query_parameters)

Das wird entlang passieren utm Parameter oder andere zusätzliche params Sie wollen nicht zu verlieren.


4

route.rb

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

Alle Controller, die Sie mit Parametern umleiten möchten, sind unten angegeben:

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

3

Routen Sie Ihren Weg und nehmen Sie den paramsund kehren Sie zurück:

redirect_to controller: "client", action: "get_name", params: request.query_parameters and return
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.