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

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


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')

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)


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| %>

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


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

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ć.


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" 

3

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

redirect_to controller: "client", action: "get_name", params: request.query_parameters and return
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.