我在Rails应用程序中遇到一个非常简单的问题,我找不到一个优雅的解决方案.
我有一个URL:http://www.example.com/some-path/?foo = 123&baz = 456
我想处理其中一个参数并重定向到:http://www.example.com/some-path/? baz = 456
我希望这通常用于任何带有param"foo"的URL,所以我不想在重写代码中指定"baz".
我想要的是:
redirect_to request.path, :params => request.query_parameters.except(:foo)
Run Code Online (Sandbox Code Playgroud)
除此之外不太有用.我知道我可以手动正则表达式或解析查询字符串但我认为有更好的方法.
dob*_*nov 33
到目前为止,我发现的最好的方法是使用:
url_for(params.except(:obsolete_param_name))
Run Code Online (Sandbox Code Playgroud)
UPDATE
正如格罗瑟所提到的,这会在您的应用程序中打开一个安全漏洞,因为攻击者可以将主机作为URL参数传递,并将用户重定向到其他网站.为了防止这种情况,您可以使用rap1ds的建议并指定只需要使用路径.
为此,您可以使用类似这样的辅助函数:
def secure_path_for(params, *excluded_params)
url_for(params.except(*excluded_params).merge(only_path: true))
end
Run Code Online (Sandbox Code Playgroud)
如何在传递它之前删除params [:foo].也许是这样的:
params.delete[:foo]
redirect_to request.path, :params => params
Run Code Online (Sandbox Code Playgroud)
它不是很优雅,但它只增加了一行.顺便说一句,Params是一个帮助方法,它获取url的当前参数
在rails 5中,如果您尝试执行此操作,则会出现非清理请求参数错误url_for(params.except(:param))
所以我发现这样做:
request_url = request.url # eg. http://qwe.com/path?param1=1¶m2=2
query_hash = Rack::Utils.parse_query(URI.parse(request_url).query).except('param1')
url = query_hash.empty? ? request.path : "#{request.path}?#{query_hash.to_query}"
puts url #=> /path?my_param2=2
redirect_to url
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18703 次 |
| 最近记录: |