在redirect_to request.referer中替换GET参数

时间:2014-12-02 09:35:53

标签: ruby-on-rails

我试图替换GET参数:

redirect_to request.referer

我的request.referer已包含一个参数:

http://www.foo.com/bar?par=10

当我尝试:

redirect_to request.referer, :par => 5

它没有用。它重定向到引用但不会改变:从10到5不等。 当我重定向到url_path时,例如

redirect_to root_path, :par => 5

这样可行,重定向到:

http://www.foo.com/?par=5

所以我的问题是如何在request.referer URI中替换params。另外一个问题是我是否应该使用request.referer或:back?

由于

1 个答案:

答案 0 :(得分:1)

问题是redirect_to最终只需要一个字符串,即url。如果你要做类似

的事情
redirect_to edit_foo_path(@foo, :bar => "qux")

然后您使用路径助手来生成该字符串。即,edit_foo_path(:bar => "qux")是帮助者,它将被转换为"/foo/123/edit?bar=qux",这只是一个愚蠢的"串。如果您正在使用助手,您可以切换参数,但如果您知道我的意思,那么它已经完成了。

request.referer也是一个字符串,因此您需要做的是将其分解为其组成部分,根据需要修改这些部分,然后再将其重新组合成一个字符串。有问题的部分是协议,主机,路径& PARAMS。在这种情况下,您不需要更改协议,主机或路径,因此您可以保持相同。当转换为哈希时,params将最容易被操纵。 Rails有各种url处理功能,你可以在这里使用,所以可能有几种不同的方法。我会像下面这样做,这可能不是最有效的。

url = URL(request.referer)
#you could get this via a regex but i'm doing it "formally" with the Url object
host_and_path = "#{url.scheme}://#{url.host}#{url.path}"
params = CGI.parse(url.query)
#now you've got params as a hash you can do what you want to it.
params["par"] = 5
new_url = "#{host_and_path}?#{params.to_param}"
redirect_to new_url

就像我说那里可能更有效率(就代码行而言,速度方面没有问题)这样做的方法,但看到它有用无论如何,我猜是一步一步的方法。