ruby-on-rails Rails -重定向到当前url,不使用任何GET参数

31moq8wy  于 2023-01-10  发布在  Ruby
关注(0)|答案(5)|浏览(1137)

我在一个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)

我知道我可以用正则表达式或者手动解析查询字符串,但是我认为有更好的方法。

7gyucuyw

7gyucuyw1#

最好的方法,我已经发现到目前为止是使用:

url_for(params.except(:obsolete_param_name))
    • 更新**

正如grosser提到的那样,这在你的应用程序中打开了一个安全漏洞,因为攻击者可以将一个主机作为url参数传递,并将用户重定向到一个不同的网站。为了防止这种情况,你可以使用rap1ds的建议,并指定只使用路径。
为此,您可以使用类似下面的帮助器函数:

def secure_path_for(params, *excluded_params)
  url_for(params.except(*excluded_params).merge(only_path: true))
end
o7jaxewo

o7jaxewo2#

在沿着之前删除params[:foo]怎么样?可能类似于:

params.delete[:foo]
redirect_to request.path, :params => params

它不是很优雅,但它只增加了一行。Params是一个helper方法,它获取url的当前参数

webghufk

webghufk3#

在rails 5中,如果尝试执行此操作,您将得到未清理的请求参数错误url_for(params.except(:param))
所以我找到了这个方法:

request_url = request.url # eg. http://qwe.com/path?param1=1&param2=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
p5cysglq

p5cysglq4#

uri = URI.parse(request.url)
new_query = uri.query.split("&").reject{|pair|
  k,v = pair.split("=")
  k =~ /^foo\[?/ # reject params named "foo" or "foo[anything"
}.join("&")
# if the new querystring is empty, assign nil instead of "" so we don't
# end up with a solitary question mark at the end of the url.
uri.query = (new_query.empty? ? nil : new_query)
redirect_to uri.to_s

我是在尝试用“Rails方式”做事情时遇到一些不太明显的问题之后才想到上面的解决方案的,如果有这样的方式来解决这个问题的话。

  • Rails参数解析将自动示例化使用特殊方括号语法的查询参数的数组和散列:?x[a]=1&y[]=2变成{"x"=>{"a"=>"1"}, "y"=>["2"]}等等,所以使用所提供的querystring和param例程的代码在这方面很难处理。结果,通过原始字符串值过滤参数可能很困难。即使是非rails/rack CGI模块也会为参数值给予数组而不是字符串。
  • rails params散列包括GET、POST和路由参数,例如:action:controller,因此无论如何都不能重用它来重构查询字符串。
  • 因此,URL帮助器(如url_for)没有多大帮助。

考虑到这些问题,我发现我不能使用提供的框架功能来获得一个纯粹的、不受干扰的查询字符串,从当前请求中复制出来,简单地只删除一个参数,但是上面的代码看起来工作得很好。

5sxhfpxr

5sxhfpxr5#

万一有人以后来看这个,这就是对我起作用的方法

link_to request.params.except(:param)

相关问题