如何在rails中向当前URL添加参数

17 浏览
0 Comments

如何在rails中向当前URL添加参数

我有一个逻辑,允许按照价格和相关性进行排序。我通过将参数传递给控制器来实现这一点。我的URL有一个参数 - 'sort',它可以有一个值 - 'price_lowest'或'default'。

链接如下:

最低价格 | 
相关性

上面的代码的问题是它“添加”参数而不是“替换”它们。我想要替换&sort=参数的值,而不是添加新的值。例如,我不想要:

../&sort=price_lowest&sort=price_lowest&sort=default

根据当前的逻辑 - 我得到了上述的行为。有什么建议吗?

0
0 Comments

在Rails中,如果在link_to方法中没有传递路径参数,那么默认使用当前的params。在Rails 3.2中,这是最优雅的方法来添加或修改URL中的参数:

<%= link_to 'lowest prices', params.merge(sort: 'end_date') %>
<%= link_to 'relevance', params.merge(sort: 'default') %>

params是一个Ruby哈希。使用merge方法可以添加一个键或替换一个键的值。如果将nil作为键的值传递,则会从哈希中删除该键/值对。

<%= link_to 'relevance', params.merge(sort: nil) %>

引用:

结合使用active_link_to Gem,您还可以在筛选器上获得漂亮的活动类。- github.com/comfy/active_link_to

您应该在控制器中更新您的答案,使用强参数和params.permit!

0
0 Comments

在Rails中如何向当前URL添加参数

如果您只需要一个cgi参数并希望保留在同一页上,这非常简单:

<%= link_to "最低价格", :sort => "price_lowest" %>

然而,如果您有多个参数,您需要一些逻辑来保留旧的参数。最好将其提取到一个helper中,但基本上您可以这样做来保留其他参数:

<%= link_to "最低价格", :sort => "price_lowest", :other_param => params[:other] %>

命名路由在这里只有在您需要转到另一个页面时才真正有用。

这会删除现有的参数。我最终得到 - localhost:3000/view?sort=price_lowest - 所有其他先前的参数都丢失了。

你能详细说明一下你的解决方案吗?

正如我在答案中所说的,如果您有超过一个参数,您需要一些逻辑来保留您没有设置的参数。将这样的代码放入helper中绝对是最好的地方。这里是一个(可能有缺陷,写得不好并且未经测试)实现的例子:raw.github.com/gist/e22343babcb76381304c/…

如果您只需要URL,您可以使用url_for params.merge( sort: 'price_lowest' )

不起作用,会丢失所有其他参数

使用params.merge( sort: "price_lowest" )确实起作用并保留现有的参数。如果您没有看到这个效果,那么您的代码可能出了其他问题。注意:对于Rails 5,您需要使用request.params.merge

根据下一个答案,它确实起作用。但是我们正在评论的答案除了提供给link_to的参数之外,丢失了所有其他参数。

该答案确实是错误的。抱歉,可能是我看答案时眼花了。我以为你在评论我的评论,而不是答案本身。 🙂

如果您需要添加一个class,可以这样做:link_to "最低价格", { sort: "price_lowest" }, class: "button"

0
0 Comments

在Rails中,有时我们需要在当前URL中添加参数。然而,直接使用params.merge方法会导致URL看起来不太美观。为了解决这个问题,可以使用request.params.merge方法来添加参数。

在Rails 5中,需要使用request.params来替代params来添加参数。具体代码如下:

<%= link_to 'Date', request.params.merge(sort: "end_date") %>

在Rails 5中,使用request.params.merge方法添加参数是推荐的做法,可以避免URL变得丑陋。关于这个问题,可以参考https://github.com/rails/rails/issues/26289,里面提供了解释风险和解决方案的示例。

0