在rails redirect_to中传递参数


201

我们如何在rails的redirect_to中传递参数?我知道我们可以使用以下方式传递ID:

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

如果我想传递一些表单数据之类的附加参数,怎么实现呢?

编辑:

对于Ruby 2语法,您必须将以上代码段更新为:

redirect_to action: action_name, id: 3

3
您实际上想完成什么?您是否考虑过在会话中保存数据?
Michael Sepcot 09年

1
您所要求的内容是不可能的-如果您要进行重定向,则必须是您要重定向到的GET请求,因此用户始终可以看到这些参数。您应该将内容存储在会话中。
GregT

Answers:


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

您好,非常感谢您的回复。我是Web开发的新手。我试图了解不同的方法来调用动作。您的回答澄清了我的很多疑问。再次感谢:))
markiv

竖起大拇指。自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)


1
您知道如何将其与新参数结合起来吗?即request.parameters,(或+):this =>:that
Chris Edwards 2012年

5
您可以使用merge方法。例如:redirect_to act_house_path(request.parameters.merge(key: "value"))
GregT

3
合并后,您也可以使用except方法排除不需要的参数:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit)
先生io

39

您可以使用flash参数将任意对象传递到模板。

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

然后通过哈希在模板中访问它们。

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

63
这是不好的做法。此方法滥用Flash对象,该对象旨在用于用户消息传递。最好是在会话中存储任意参数,然后在完成后从会话中清除这些参数。
GregT


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

6
您能否提供更多解释。仅仅一个代码示例确实是不够的。
simonmenke 2012年

7

如果您正在寻找一种传递其他URL参数(而不是控制器,操作,ID等)的方法,那么以下是一种健壮的方法:

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" 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.