2

我有以下函数将 URL 解码为由 URL 的不同部分组成的哈希。例如,在我分配的第一行之后hash,我收到以下输出:

>> CGI.parse(URI.parse("http://google.com/?foo=bar&baz=hello").query)
=> {"foo"=>["bar"], "baz"=>["hello"]}

在这个函数中,如果键是“p”或“q”,我会尝试提取值。我本质上想将散列过滤成我想要的键和值。

我的目标是只显示某人搜索的关键字,例如brickor cement

这是我的功能:

  def self.get_search_terms(search_url)
    hash = CGI.parse(URI.parse(URI.encode(search_url)).query) #returns a hash
    keywords = []
    hash.each do |key|
      if key["q"] != nil || 
        key["p"] != nil
        keywords << key
      end
    end
    keywords
  end
4

3 回答 3

3

一种方法:

def self.get_search_terms(search_url)
  hash = CGI.parse(URI.parse(URI.encode(search_url)).query)
  keywords = []
  hash.each do |key, value|
    if key == 'p' || key == 'q'
      keywords << value
    end
  end
  keywords
end
于 2012-07-24T00:26:19.953 回答
1

更惯用的 ruby​​ 方式,本质上是一个衬里:

def self.get_search_terms(search_url)
  CGI.parse(URI.parse(URI.encode(search_url)).query).values_at('q','p')
end

哈希#values_at

如果要消除空参数,请在其中添加拒绝空白:

.values_at('q','p').reject(&:blank?)
于 2012-07-24T02:09:00.747 回答
0

可能是 100 种方法之一!

def self.get_search_terms(search_url)
  myhash = CGI.parse(URI.parse(URI.encode(search_url)).query) 
  keywords = []
  ["p","q"].each do |mykey|
     if myhash.has_key?(mykey)
       keywords << myhash[mykey]
     end
  end
  keywords
end

或许

def self.get_search_terms(search_url)
  myhash = CGI.parse(URI.parse(URI.encode(search_url)).query) 
  keywords = []
  mykeywords = ["p","q"]
  mykeywords.each do |mykey|
    if myhash.has_key?(mykey)
      keywords << myhash[mykey]
    end
  end
  keywords
end

在这两个版本中,您正在寻找的关键字列表是初始循环。您使用以下方法隐式迭代从 URI 中提取的哈希:

myhash.has_key?

这将遍历我的哈希,如果它包含键,则将键的值添加到关键字。

于 2012-07-24T00:13:01.330 回答