Передача параметров в рельсы redirect_to

202

Как мы передаем параметры в redirect_to в рельсах? Я знаю, что мы можем передать идентификатор, используя это:

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

Если я хочу передать дополнительные параметры, такие как данные формы, как этого добиться?

РЕДАКТИРОВАТЬ:

Для синтаксиса Ruby 2 вы должны обновить приведенный выше фрагмент:

redirect_to action: action_name, id: 3
Маркив
источник
3
Что вы на самом деле пытаетесь достичь? Рассматривали ли вы сохранение данных в сеансе?
Майкл Сепкот
1
То, что вы просите, невозможно - если вы делаете перенаправление, это должен быть запрос GET, на который вы перенаправляете, чтобы параметры всегда были видны вашим пользователям. Вы должны хранить вещи в сессии вместо этого.
GregT

Ответы:

174

Просто добавьте их к параметрам:

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

Даст /thing/3/edit?something=else

Майкл Сепкот
источник
22
Вы не можете перенаправить с помощью POST. Из документов HTTP 1.1 согласно определениям 3xx: «Требуемое действие МОЖЕТ быть выполнено пользовательским агентом без взаимодействия с пользователем в том и только в том случае, если во втором запросе используется метод GET или HEAD». Раскройте, что вы действительно пытаетесь достичь, и мы, вероятно, сможем подтолкнуть вас в правильном направлении.
JDL
Привет Большое спасибо за ваш ответ. Я новичок в веб-разработке. Я пытаюсь узнать разные способы вызвать действие. Ваш ответ прояснил многие мои сомнения.
Еще
Недурно. Я искал это с 1 часа.
86

Если вы используете ресурсы RESTful, вы можете сделать следующее:

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

Если у вас есть данные формы, например, отправленные в home # action, теперь вы хотите перенаправить их в house # act с сохранением параметров, вы можете сделать это

redirect_to act_house_path(request.parameters)

V4R
источник
1
Вы знаете, как бы вы это соединили, плюс новые параметры? т.е. request.parameters, (или +): this =>: that
Крис Эдвардс
5
Вы можете использовать метод слияния. Например:redirect_to act_house_path(request.parameters.merge(key: "value"))
GregT
3
Вы также можете использовать метод exc, чтобы исключить нежелательные параметры после слияния:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit)
mr io
39

Вы можете передавать произвольные объекты в шаблон с помощью параметра flash.

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

А затем получить доступ к ним в шаблоне через хэш.

<% flash[:new_solution_errors].each do |err| %>
vermasque
источник
63
Это плохая практика. Этот метод использует объект flash, он предназначен для обмена сообщениями пользователя. Лучше было бы сохранить произвольные параметры в сеансе, а затем удалить эти параметры из сеанса, когда вы закончите.
GregT
30
redirect_to new_user_path(:id => 1, :contact_id => 3, :name => 'suleman')
Мухаммед Сулеман
источник
7
redirect_to :controller => "controller_name", :action => "action_name", :id => x.id
Karwin
источник
6
Можете ли вы предоставить более подробное объяснение. Просто пример кода действительно не достаточно.
Симонменке
7

Если вы ищете способ передать дополнительные параметры URL (не контроллер, действие, идентификатор и т. Д.), Вот надежный метод для этого:

object_path(@object, params: request.query_parameters)

Это передаст параметры utm или любые другие дополнительные параметры, которые вы не хотите потерять.

Аврам
источник
4

routes.rb

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

Любой контроллер, который вы хотите перенаправить с параметрами, указан ниже:

redirect_to abc_path(@abc, id: @id), :notice => "message fine" 
Митеш Шарма
источник
3

Проложите свой путь, возьмите paramsи вернитесь:

redirect_to controller: "client", action: "get_name", params: request.query_parameters and return
Дарлан Дитрих
источник