Ruby on rails 将查询字符串追加到url
我有一个回调url字符串Ruby on rails 将查询字符串追加到url,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个回调url字符串params[:callback],我需要附加一个查询字符串“&result=true”,并重定向用户。我发现更好的方法是使用addressable,但我认为对于这样的任务来说,代码太大了,特别是当我们谈论ruby时: callback = Addressable::URI.parse(params[:callback]) query = callback.query_values query[:result] = 'true' callback.query_values
params[:callback]
,我需要附加一个查询字符串“&result=true”
,并重定向用户。我发现更好的方法是使用addressable
,但我认为对于这样的任务来说,代码太大了,特别是当我们谈论ruby时:
callback = Addressable::URI.parse(params[:callback])
query = callback.query_values
query[:result] = 'true'
callback.query_values = query
redirect_to callback.to_s
有没有更优雅的方法可以获得与此片段相同的结果?- 如果您不需要任何URL验证,可以这样做(看起来有点脏):
- 否则,您必须使用一些外部库(如可寻址库)或标准库中的URI模块
merge
request.parameters.merge({:result=>true})
这将把您的参数添加到已经定义的参数中。我认为您非常接近最优。你可以挤出一两行,
callback.query_values = callback.query_values.merge({"result" => "true"})
但这并不能给你带来任何好处
callback = Addressable::URI.parse(params[:callback])
callback.query_values = callback.query_values.merge {:results => 'true' }
redirect_to callback.to_s
如果回调始终在应用程序中,您可能会有一些不同程度的其他选项,但您没有指定是否存在这种情况。我不想更新此主题,因为任何解决方案都不适用于我 原因是,如果实际url没有现有的查询值,那么
callback.query\u values
似乎会返回Nil
因此,如果您有如下URL:http://www.foo.com
和http://www.foo.com?bar=1
您应该使用以下代码:
url = "http://www.foo.com" # or params[:callback] obviously. :)
callback = Addressable::URI.parse(url)
callback.query_values = (callback.query_values || {}).merge({
result: true
})
redirect_to callback.to_s
干杯。几年后,我找到了解决这个问题的更好办法 首先从
super
获取值,然后使用Addressable
def url_for(options={})
val = super
if params[:locale].present?
parsed = Addressable::URI.parse(val)
query_array = parsed.query_values(Array) || []
query_array << ['locale', params[:locale]]
parsed.query_values = query_array
val = parsed.to_s
end
val
end
def url_for(选项={})
瓦尔=超级
如果参数[:locale]。是否存在?
parsed=可寻址::URI.parse(val)
query_数组=已解析。query_值(数组)||[]
query_数组OP在变量中包含URL。这不是当前的请求。是的,看起来很脏。使用Addressable查看我的代码,这段代码会更短吗?Mauna下面的回答更好,因为回调。query\u value
可以返回nil
,它不会响应merge
,我只想补充一点,如果参数可能已经存在,请确保“result”
是一个字符串,不是符号:结果
,因此不会得到像“”或“”这样的双参数。另外,如果true是一个布尔值结果:true
而不是字符串结果:“true”
这可能会引发参数错误(数组与数组的比较失败)
def url_for(options={})
val = super
if params[:locale].present?
parsed = Addressable::URI.parse(val)
query_array = parsed.query_values(Array) || []
query_array << ['locale', params[:locale]]
parsed.query_values = query_array
val = parsed.to_s
end
val
end