Przekazywanie parametrów w szynach redirect_to

201

Jak przekazujemy parametry w redirect_to w szynach? Wiem, że możemy przekazać identyfikator za pomocą tego:

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

Jeśli chcę przekazać dodatkowe parametry, takie jak dane formularza, jak to osiągnąć?

EDYTOWAĆ:

W przypadku składni Ruby 2 musisz zaktualizować powyższy fragment, aby:

redirect_to action: action_name, id: 3
markiv
źródło
3
Co tak naprawdę próbujesz osiągnąć? Czy zastanawiałeś się nad zapisaniem danych w sesji?
Michael Sepcot,
1
To, o co prosisz, nie jest możliwe - jeśli wykonujesz przekierowanie, musi to być żądanie GET, do którego przekierowujesz, aby parametry były zawsze widoczne dla użytkowników. Zamiast tego powinieneś przechowywać rzeczy w sesji.
GregT

Odpowiedzi:

174

Wystarczy dołączyć je do opcji:

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

Dałby /thing/3/edit?something=else

Michael Sepcot
źródło
22
Nie można przekierowywać za pomocą POST. Z dokumentów HTTP 1.1 w definicjach 3xx: „Wymagane działanie MOŻE zostać przeprowadzone przez klienta użytkownika bez interakcji z użytkownikiem wtedy i tylko wtedy, gdy metodą zastosowaną w drugim żądaniu jest GET lub HEAD.” Rozwiń to, co naprawdę próbujesz osiągnąć, a prawdopodobnie popchniemy Cię we właściwym kierunku.
jdl
Cześć. Dziękuję bardzo za odpowiedź. Jestem początkującym programistą. Próbuję poznać różne sposoby wywołania akcji. Twoja odpowiedź wyjaśniła wiele moich wątpliwości.
Jeszcze
Kciuki w górę. Szukałem tego od 1 godziny.
86

Jeśli korzystasz z zasobów RESTful, możesz wykonać następujące czynności:

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
źródło
46

Jeśli masz jakieś dane formularza, na przykład wysłane do akcji # domu, teraz chcesz przekierować je do akcji # domu, zachowując parametry, możesz to zrobić

redirect_to act_house_path(request.parameters)

v4r
źródło
1
Czy wiesz, jak byś to połączył i nowe parametry? tj. request.parameters, (lub +): this =>: that
Chris Edwards
5
Możesz użyć metody scalania. Na przykład:redirect_to act_house_path(request.parameters.merge(key: "value"))
GregT
3
Możesz także użyć metody wyjątków, aby wykluczyć niechciane parametry po scaleniu:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit)
pan io
39

Możesz przekazać dowolne obiekty do szablonu za pomocą parametru flash.

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

A następnie uzyskaj do nich dostęp w szablonie za pomocą skrótu.

<% flash[:new_solution_errors].each do |err| %>
wermasque
źródło
63
To zła praktyka. Ta metoda niewłaściwie wykorzystuje obiekt Flash, który jest przeznaczony do przesyłania wiadomości użytkownikom. Lepiej byłoby zapisać dowolne parametry w sesji, a następnie usunąć te parametry z sesji, gdy skończysz.
GregT
30
redirect_to new_user_path(:id => 1, :contact_id => 3, :name => 'suleman')
Muhammad Suleman
źródło
7
redirect_to :controller => "controller_name", :action => "action_name", :id => x.id
Karwin
źródło
6
Czy możesz podać jakieś wyjaśnienie. Sam przykład kodu naprawdę nie wystarczy.
simonmenke
7

Jeśli szukasz sposobu na przekazanie dodatkowych parametrów adresu URL (nie kontrolera, akcji, identyfikatora itp.), Oto niezawodna metoda:

object_path(@object, params: request.query_parameters)

To przekaże parametry utm lub inne dodatkowe parametry , których nie chcesz stracić.

Abram
źródło
4

trasy.rb

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

Każdy kontroler, który chcesz przekierować za pomocą parametrów, znajduje się poniżej:

redirect_to abc_path(@abc, id: @id), :notice => "message fine" 
Mitesh Sharma
źródło
3

Wytycz swoją ścieżkę, weź paramsi wróć:

redirect_to controller: "client", action: "get_name", params: request.query_parameters and return
Darlan Dieterich
źródło