删除尾随“?”从一个字符串

时间:2013-04-03 10:33:03

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我有这个网址:

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

我有一个帮助,可以删除网址?locale=en

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

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

结果应为http://localhost:3000/blog/posts

3 个答案:

答案 0 :(得分:9)

使用#gsub

uri = "http://localhost:3000/blog/posts?locale=en"
uri.gsub(/\?.*/, '')
  #=> "http://localhost:3000/blog/posts"

答案 1 :(得分: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

答案 2 :(得分:5)

到目前为止,答案都是关于字符串本身的。你实际在做的是告诉它它有params ""。如果你nil params.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也会假设有一些要附加的内容,因此它会将初始?置于其中。