Передача параметрів у рейках redirect_to


201

Як ми передаємо параметри в 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, тепер ви хочете перенаправити їх на home # act, зберігаючи параметри, ви можете це зробити

redirect_to act_house_path(request.parameters)


1
Чи знаєте ви, як би ви поєднали це, а також нові параметри? тобто request.parameters, (або +): this =>: that
Кріс Едвардс

5
Ви можете використовувати метод злиття. Наприклад:redirect_to act_house_path(request.parameters.merge(key: "value"))
GregT

3
Ви також можете використати винятковий метод, щоб виключити небажані парами після злиття:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit)
г-н Іо

39

Ви можете передавати довільні об'єкти до шаблону за допомогою параметра flash.

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

А потім відкрийте їх у шаблоні через хеш.

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

63
Це погана практика. Цей метод неправильно використовує флеш-об’єкт, призначений для обміну повідомленнями користувачів. Краще було б зберігати довільні параметри в сеансі, а потім очищати ці параметри з сеансу, коли закінчите.
GregT


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

6
Чи можете ви надати трохи більше пояснень. Просто прикладу коду насправді недостатньо.
simonmenke

7

Якщо ви шукаєте спосіб передачі додаткових параметрів URL-адреси (не контролер, дія, ідентифікатор тощо), ось надійний метод для цього:

object_path(@object, params: request.query_parameters)

Це передасть параметри utm або будь-які інші додаткові параметри, які ви не хочете втрачати.


4

маршрути.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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.