【发布时间】:2012-11-07 19:26:56
【问题描述】:
我在 Rails 应用程序中有一个非常简单的问题,但我找不到优雅的解决方案。
我有一个类似的网址: http://www.example.com/some-path/?foo=123&baz=456
我想处理其中一个参数并重定向到: http://www.example.com/some-path/?baz=456
我希望这通常适用于任何带有参数“foo”的 URL,所以我不想在重写代码中指定“baz”。
我想要的是这样的:
redirect_to request.path, :params => request.query_parameters.except(:foo)
除非那不太行。我知道我可以手动正则表达式或解析查询字符串,但我认为有更好的方法。
【问题讨论】:
-
在什么情况下不起作用?你有错误吗?你得到一个你没想到的 URL 吗?
-
上面的代码实际上并没有在重定向中保留 baz=456
-
作为参考,这段代码完全符合我的要求(为格式化道歉):
query_string = request.query_parameters.except(:foo).map{|k,v| "#{k}=#{v}"}.join('&')redirect_to query_string ? "#{request.path}?#{query_string}" : request.path -
您评论中的代码有多个问题。重建 url 时,您并没有转义那些查询字符串参数。如果其中任何一个包含 = 或 & 或其他应编码的特殊字符,您将得到一个非常损坏的重定向 url。此外,此代码将无法正确处理 request.query_parameters 为您提供的
x[a]=1&x[b]=2等查询参数的自动散列和数组化。这就是为什么编写自己的查询字符串操作代码通常是一个坏主意的两个原因,尤其是在像 rails 这样的复杂框架中。
标签: ruby-on-rails