删除尾随"?" 从一个字符串

hyp*_*jas 7 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我有这个网址:

http://localhost:3000/blog/posts?locale=en
Run Code Online (Sandbox Code Playgroud)

我有一个帮助删除?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
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*rns 9

使用#gsub:

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


Sim*_*tti 9

String#chomp 是一种可能性.

1.9.3p392 :002 > "foobar?".chomp("?")
 => "foobar" 
Run Code Online (Sandbox Code Playgroud)

最后的方法是

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
Run Code Online (Sandbox Code Playgroud)

  • 事实上,这就是他所要求的.如果您阅读他的问题并查看方法,他已经使用`Rack :: Utils`解析查询,然后他使用`to_param`生成查询字符串,这里附加了尾随的`?`. (3认同)

Mik*_*ell 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
Run Code Online (Sandbox Code Playgroud)

这样的事情应该可以解决问题.这样做的原因是,即使使用空字符串,URI也会假设有一些要附加的内容,因此它会将首字母?放在上面.