【问题标题】:Remove trailing "?" from a string删除尾随的“?”从一个字符串
【发布时间】:2013-04-03 10:33:02
【问题描述】:

我有这个网址:

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

我有一个助手可以删除 url 的?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

【问题讨论】:

  • 问号后面的URL部分称为“查询字符串”。
  • 正确的答案是将nil 分配给params,正如 Mike Campbell 所说。
  • 很容易理解为什么你会尝试使用字符串操作来处理返回的 URL,但是,当使用一个设计来管理这些东西的类时,利用它的特性真的很好。不过,URI 并不是 Ruby 的最佳/功能最全的 URI 工具。如果您想要更全面的内容,请查看Addressable::URI
  • @theTinMan 我已使用此功能,因为我无法从控制器中删除 set_locale。你可以看看这个问题stackoverflow.com/questions/15767715/…。如果有其他方法删除 set_locale 我将非常感激听到你的方法!谢谢
  • Ruby 的 URI(或 Addressable::URI)为您提供了从查询中删除元素和/或完全删除查询的方法。如果您在收到 URL 时只得到?locale=en,那么设置uri.query=nil,正如 Mike Campbell 所说,是正确的,因为它将完全摆脱 URL 的查询部分。在 URI 处理后使用字符串操作会产生代码异味,我们有时必须这样做,但最好避免。

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


【解决方案1】:

使用#gsub:

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 这仅在? 是字符串的最后一个字符时有效。之后它不会删除字符。
    • 其实他是这么问的。如果您阅读了他的问题并查看了方法,他已经使用Rack::Utils 解析查询,然后他使用to_param 生成查询字符串,这里是尾随? 的附加位置。
    • 你完全正确!在这种情况下,你的答案是最好的 - 赞成。
    • 简单优雅的解决方案,我喜欢。太棒了!
    【解决方案3】:

    到目前为止,答案都与字符串本身有关。你实际上在做的是告诉它它有参数""。如果你做到了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 也会假设有一些内容要附加,所以它会将初始的 ? 放在上面。

    【讨论】:

    • 没错,这个回答是最好的。抱歉耽搁了!
    猜你喜欢
    • 2015-04-03
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多