【问题标题】:How to get a query string from a URL in Rails如何从 Rails 中的 URL 获取查询字符串
【发布时间】:2011-11-11 02:42:33
【问题描述】:

有没有办法在 Rails 中通过 URL 字符串获取查询字符串?

我想传递一个 URL 字符串:

http://www.foo.com?id=4&empid=6

如何获得idempid

【问题讨论】:

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


    【解决方案1】:

    如果字符串中有 URL,则使用 URI 和 CGI​​ 将其分开:

    url    = 'http://www.example.com?id=4&empid=6'
    uri    = URI.parse(url)
    params = CGI.parse(uri.query)
    # params is now {"id"=>["4"], "empid"=>["6"]}
    
    id     = params['id'].first
    # id is now "4"
    

    这些东西请使用标准库,不要尝试用正则表达式自己做。

    另见下方 Quv 对Rack::Utils.parse_query 的评论。

    参考资料:


    更新:这些天我可能会使用Addressable::Uri 而不是标准库中的URI

    url = Addressable::URI.parse('http://www.example.com?id=4&empid=6')
    url.query_values                  # {"id"=>"4", "empid"=>"6"}
    id    = url.query_values['id']    # "4"
    empid = url.query_values['empid'] # "6"
    

    【讨论】:

    • 虽然这个答案得到了很多人的支持,但我不喜欢它总是返回 Array 的值。或者,我们可以使用 Rack::Utils.parse_query(URI(url).query) 之类的东西。
    • 这个答案已经过时了。请参阅下面 Russel 的回答。没错。
    • @SteveCarey 请再次阅读问题并阅读 OP 对您首选答案的评论。问题是如何解析字符串中的 URL 并从中提取参数,这与 Rails 控制器中的params 方法没有任何关系。
    • @mu 太短 - 好的,OP 确实想在解析查询字符串之前将其转换为实际字符串。但是大多数阅读这个老问题的人只是想从查询字符串中获取键值对,而不需要先将其转换为实际字符串。所以我的评论只是说罗素在下面的回答是最直接的方法。
    【解决方案2】:
    vars = request.query_parameters
    vars['id']
    vars['empid']
    

    等等。

    【讨论】:

    • 对于 Rails 域,这是最好的答案
    • 不,这不是 Rails 的最佳答案。 OP 要求解析 String URL,这个答案假设上下文中有request,就像一个控制器。
    • 我想将它用于控制器......所以它非常适合。 Tks
    【解决方案3】:

    在 Ruby on Rails 控制器方法中,URL 参数在名为 params 的哈希中可用,其中的键是参数名称,但作为 Ruby“符号”(即以冒号为前缀)。因此,在您的示例中,params[:id] 将等于 4params[:empid] 将等于 6

    我建议阅读一个很好的 Rails 教程,它应该涵盖这样的基础知识。 Here 的一个例子 - 谷歌会出现更多:

    【讨论】:

    • 感谢 Russell 的快速回复,非常感谢。但我不想从 url 中获取它,而是希望从字符串中提取它。这是我尝试做的应用程序。需要 'rubygems' 需要 'date' 需要 'cgi' 需要 File.dirname(FILE) + "/lib/provider_base.rb" Dir[File.dirname(FILE) + '/lib/*.rb'].each {|file|需要文件 } url = "foo.com?empid=6" empid = "我应该在这里做什么才能得到 empid" p empid
    • 啊,好的。那么我认为米哈伊尔的答案就是你所需要的。
    • @PrasaanthNaidu 你应该问如何在 Ruby 而不是 Rails 中做到这一点
    • 这是唯一正确的答案。其他所有方法都是错误的,至少在今天的 Rails 中(早在 2011 年他们可能是正确的)。 Params[:id] 将获取路由中的两个参数并查询参数。
    • @SteveCarey 除了问题不在于访问控制器方法中的参数,而是关于从 URL string 中提取参数。
    【解决方案4】:
    Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}
    

    引用自: Parse a string as if it were a querystring in Ruby on Rails

    以 Rails 控制器的方式解析查询字符串。嵌套查询,通常通过像这个 lil 家伙这样的表单字段名称:name="awesome[beer][chips]" # => "?awesome%5Bbeer%5D%5Bchips%5D=cool",将“切片和切块”变成一个很棒的哈希:{"awesome"=>{"beer"=>{"chips"=>nil}}}

    http://rubydoc.info/github/rack/rack/master/Rack/Utils.parse_nested_query https://github.com/rack/rack/blob/master/lib/rack/utils.rb#L90

    【讨论】:

    • 这应该是公认的答案。它比 CGI.parse 更容易使用。谢谢!!
    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2011-08-30
    相关资源
    最近更新 更多