8

我有这个网址:

http://localhost:3000/blog/posts?locale=en

我有一个帮助删除?locale=enurl:

def url_without_locale_params(url)
  uri = URI url
  params = Rack::Utils.parse_query uri.query
  params.delete 'locale'
  uri.query = params.to_param
  uri.to_s
end

有了这个助手,我得到了这个 url http://localhost:3000/blog/posts?。我想删除尾随的?.

结果应该是http://localhost:3000/blog/posts

4

3 回答 3

12

使用#gsub

uri = "http://localhost:3000/blog/posts?locale=en"
uri.gsub(/\?.*/, '')
  #=> "http://localhost:3000/blog/posts"
于 2013-04-03T10:35:13.137 回答
9

String#chomp是一种可能。

1.9.3p392 :002 > "foobar?".chomp("?")
 => "foobar" 

最后的方法是

def url_without_locale_params(url)
  uri = URI url
  params = Rack::Utils.parse_query uri.query
  params.delete 'locale'
  uri.query = params.to_param
  uri.to_s.chomp("?")
end
于 2013-04-03T10:40:39.697 回答
5

到目前为止的答案都与字符串本身有关。你实际上在做的是告诉它它有 params ""。如果你做到了nilparams.to_param == ""你就不会遇到这个问题。

def url_without_locale_params(url)
  uri = URI url
  params = Rack::Utils.parse_query uri.query
  params.delete 'locale'
  uri.query = params.to_param.blank? ? nil : params.to_param
  uri.to_s
end

像这样的东西应该可以解决问题。这样做的原因是,即使是一个空字符串,URI 也会假设有一些东西要附加,所以它会把初始值?放在上面。

于 2013-04-03T10:49:00.220 回答