38
url_for([:edit, @post])

正在工作和生成/comments/123/edit。现在我需要添加一个查询参数,以便代替

/comments/123/edit

它是

/comments/123/edit?qp=asdf

我试过url_for([:edit, @post], :qp => "asdf")但不行。

4

4 回答 4

34

使用命名路由。

edit_post_path(@post, :qp => "asdf")
于 2011-02-17T16:23:56.783 回答
24

您可以使用polymorphic_path

polymorphic_path([:edit, @post], :qp => 'asdf')
于 2012-10-15T03:47:18.267 回答
19

你可以params传给url_for. 在源代码中查看它:https ://github.com/rails/rails/blob/d891c19066bba3a614a27a92d55968174738e755/actionpack/lib/action_dispatch/routing/route_set.rb#L675

于 2013-10-02T14:05:31.743 回答
11

Simone Carletti的回答确实有效,但有时希望使用 Rails 路由指南中描述的对象来构造 URL,而不是依赖于_path帮助程序。

BenSwards的答案都试图准确描述如何做到这一点,但对我来说,使用的语法会导致错误(使用 Rails 4.2.2,它与 4.2.4 具有相同的行为,这是当前的稳定版本从这个答案开始)。

在传递参数的同时从对象创建 URL/路径的正确语法应该是,而不是嵌套数组,而是包含 URL 组件的平面数组,加上作为最终元素的哈希:

url_for([:edit, @post, my_parameter: "parameter_value"])

这里前两个元素被解析为 URL 的组件,哈希被视为 URL 的参数。

这也适用于link_to

link_to( "Link Text", [:edit, @post, my_parameter: "parameter_value"])

当我url_for按照 Ben & Swards 的建议打电话时:

url_for([[:edit, @post], my_parameter: "parameter_value"])

我收到以下错误:

ActionView::Template::Error (undefined method 'to_model' for #<Array:0x007f5151f87240>)

跟踪显示这是从polymorphic_routes.rbin ActionDispatch::Routing,通过url_forfrom routing_url_for.rb( ActionView::RoutingUrlFor) 调用的:

gems/actionpack-4.2.2/lib/action_dispatch/routing/polymorphic_routes.rb:297:in `handle_list'
gems/actionpack-4.2.2/lib/action_dispatch/routing/polymorphic_routes.rb:206:in `polymorphic_method'
gems/actionpack-4.2.2/lib/action_dispatch/routing/polymorphic_routes.rb:134:in `polymorphic_path'
gems/actionview-4.2.2/lib/action_view/routing_url_for.rb:99:in `url_for'

问题在于,它需要一个 URL 组件数组(例如符号、模型对象等),而不是包含另一个数组的数组。

查看 中的相应代码routing_url_for.rb我们可以看到,当它接收到一个具有哈希作为最终元素的数组时,它将提取哈希并将其视为参数,然后只留下带有 URL 组件的数组。

这就是为什么以散列作为最后一个元素的平面数组有效,而嵌套数组则无效。

于 2015-10-30T13:52:38.740 回答