2

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
4

3 に答える 3

3

それを行う1つの方法:

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

より慣用的なルビーの方法、本質的に1つのライナー:

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

Hash#values_atを参照してください

空のパラメータを削除する場合は、拒否ブランクを追加します。

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

おそらくそれを行う100の方法の1つです!

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 に答える