2009-09-16 4 views
171

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

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

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

EDIT:

Для синтаксиса рубин 2 вам необходимо обновить фрагмент кода выше:

redirect_to action: action_name, id: 3 
+3

Что вы на самом деле пытаетесь достичь? Рассматривали ли вы сохранение данных в сеансе? –

+1

То, о чем вы просите, невозможно - если вы делаете перенаправление, это должен быть запрос GET, к которому вы перенаправляетесь, поэтому параметры всегда будут видны вашим пользователям. Вместо этого вы должны хранить материал в сеансе. – GregT

ответ

146

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

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

дают бы /thing/3/edit?something=else

+5

, но я не хочу, чтобы он был видимым пользователю .... – markiv

+14

Вы не можете перенаправлять с помощью POST. Из документов HTTP 1.1 под определениями 3xx: «Требуемое действие МОЖЕТ быть выполнено пользовательским агентом без взаимодействия с пользователем, если и только если метод, используемый во втором запросе, является GET или HEAD». Развернитесь на том, что вы действительно пытаетесь выполнить, и мы, вероятно, можем подтолкнуть вас в правильном направлении. – jdl

+0

Привет Большое спасибо за ваш ответ. Я новичок в веб-разработке. Я пытаюсь узнать различные способы вызова действия. Ваш ответ прояснил многие мои сомнения. Еще раз спасибо :)) – markiv

68

Если вы используете ресурсы 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') 
38

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

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

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

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

Это плохая практика. Этот метод неправильно использует флэш-объект, предназначенный для обмена сообщениями пользователей. Лучше было бы сохранить произвольные параметры в сеансе, а затем очистить эти параметры из сеанса, когда вы закончите. – GregT

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

Не могли бы вы дать еще несколько объяснений. На самом деле кода недостаточно. – simonmenke

38

Если у вас есть какие-то данные форм, например отправленные на дом # действия, теперь вы хотите, чтобы перенаправить их в доме # действовать, сохраняя при этих параметрах, вы можете сделать это

redirect_to act_house_path(request.parameters)

+1

Знаете ли вы, как бы вы объединили это, плюс новые параметры? то есть request.parameters, (или +): this =>: that –

+4

Вы можете использовать метод слияния. Например: 'redirect_to act_house_path (request.parameters.merge (ключ:« значение »))' – GregT

+1

Вы также можете использовать метод except для исключения нежелательных параметров после слияния: 'redirect_to act_house_path (request.parameters.except (: authenticity_token,: controller,: action,: utf8,: commit) ' –

22
redirect_to new_user_path(:id => 1, :contact_id => 3, :name => 'suleman') 
3

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" 
Смежные вопросы