我在一个Rails应用程序中遇到了一个非常简单的问题,我找不到一个优雅的解决方案。
我有一个URL,如: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)
我知道我可以用正则表达式或者手动解析查询字符串,但是我认为有更好的方法。
5条答案
按热度按时间7gyucuyw1#
最好的方法,我已经发现到目前为止是使用:
正如grosser提到的那样,这在你的应用程序中打开了一个安全漏洞,因为攻击者可以将一个主机作为url参数传递,并将用户重定向到一个不同的网站。为了防止这种情况,你可以使用rap1ds的建议,并指定只使用路径。
为此,您可以使用类似下面的帮助器函数:
o7jaxewo2#
在沿着之前删除params[:foo]怎么样?可能类似于:
它不是很优雅,但它只增加了一行。Params是一个helper方法,它获取url的当前参数
webghufk3#
在rails 5中,如果尝试执行此操作,您将得到未清理的请求参数错误
url_for(params.except(:param))
所以我找到了这个方法:
p5cysglq4#
我是在尝试用“Rails方式”做事情时遇到一些不太明显的问题之后才想到上面的解决方案的,如果有这样的方式来解决这个问题的话。
?x[a]=1&y[]=2
变成{"x"=>{"a"=>"1"}, "y"=>["2"]}
等等,所以使用所提供的querystring和param例程的代码在这方面很难处理。结果,通过原始字符串值过滤参数可能很困难。即使是非rails/rack CGI模块也会为参数值给予数组而不是字符串。params
散列包括GET、POST和路由参数,例如:action
和:controller
,因此无论如何都不能重用它来重构查询字符串。考虑到这些问题,我发现我不能使用提供的框架功能来获得一个纯粹的、不受干扰的查询字符串,从当前请求中复制出来,简单地只删除一个参数,但是上面的代码看起来工作得很好。
5sxhfpxr5#
万一有人以后来看这个,这就是对我起作用的方法