我有以下函数将URL解码为由不同的URL组成的哈希。例如,在我指定hash
的第一行之后,我收到此输出:
>> CGI.parse(URI.parse("http://google.com/?foo=bar&baz=hello").query)
=> {"foo"=>["bar"], "baz"=>["hello"]}
在这个函数中,如果键是“p”或“q”,我试图拉取值。我本质上想要将哈希过滤成我想要的键和值。
我的目标是仅显示有人搜索的关键字,例如brick
或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
答案 0 :(得分: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
答案 1 :(得分:1)
更惯用的红宝石方式,基本上是一个衬垫:
def self.get_search_terms(search_url)
CGI.parse(URI.parse(URI.encode(search_url)).query).values_at('q','p')
end
如果您想消除空参数,请在其中添加拒绝空白:
.values_at('q','p').reject(&:blank?)
答案 2 :(得分: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?
这将迭代我的哈希值,如果它包含密钥,则将密钥的值添加到关键字。