在Rails中使用redirect_to传递参数

221

如何在Rails中使用redirect_to传递参数? 我知道我们可以使用以下方法传递id:

redirect_to :action => action_name,:id => 3
如果我想传递额外的参数,例如一些表单数据,应该如何实现?
编辑:
对于Ruby 2语法,您需要更新上面的代码片段:
redirect_to action: action_name, id: 3

3
你实际上想要达成什么目标?你考虑过将数据保存在会话中吗? - Michael Sepcot
2
你正在请求的内容是不可能实现的——如果你要进行重定向,它必须是一个 GET 请求,因此参数将始终对用户可见。相反,应该将信息存储在会话中。 - GregT
10个回答

186

只需将它们附加到选项中即可:

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

将会得到 /thing/3/edit?something=else


24
你不能使用POST方法进行重定向。根据HTTP 1.1规范中3xx状态码的定义:“如果第二个请求使用的方法为GET或HEAD,则要求的操作可以由用户代理在不需要用户交互的情况下执行。”如果你能详细说明你想实现什么,我们可能会指导你朝正确的方向前进。 - jdl
非常感谢您的回复。我是一个 Web 开发的新手,正在尝试了解调用操作的不同方式。您的回复澄清了我许多疑惑。再次感谢 :)) - markiv
点赞。我已经寻找这个东西1小时了。 - user3252885
感谢提供yield示例。 - t3__rry

92

如果你正在使用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')

52
如果您有一些表单数据发送到 home#action,现在想将其重定向到 house#act 并同时保留参数,您可以使用以下代码: redirect_to act_house_path(request.parameters)

1
你知道如何结合这个,加上新的参数吗?例如:request.parameters,(或+):this => :that - Chris Edwards
8
你可以使用合并方法。例如:redirect_to act_house_path(request.parameters.merge(key: "value")) - GregT
4
你还可以使用 except 方法在合并后排除不想要的参数:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit) - mr i.o

39
您可以使用flash参数将任意对象传递到模板中。
 redirect_to :back, flash: {new_solution_errors: solution.errors}

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

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

66
这种做法很差。这种方法滥用了Flash对象,它是为用户消息而设计的。更好的方法是将任意参数存储在会话中,并在完成后从会话中清除这些参数。 - GregT

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

10

如果您想传递额外的URL参数(不是控制器、操作、ID等),这里有一种强大的方法:

object_path(@object, params: request.query_parameters)

这将传递utm参数或任何其他您不想丢失的附加参数。


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

6
请提供更多解释,仅有代码示例并不足够。 - simonmenke

7

将您的路径路由,获取params,并返回:

redirect_to controller: "client", action: "get_name", params: request.query_parameters and return

6

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" 

5

从Rails 6开始,您可以简单地调用redirect_to,然后跟随您希望重定向到的路径,例如home_path,然后传递键值对的哈希表。

示例:

redirect_to home_path(name: 'Jason', needs: 'help with rails', help: true)

在这之后,您将能够从参数哈希中检索这些值。
例如:
使用params[:name]可以检索字符串'Jason'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接