-1

次のコードを使用して、サイト内のセクションを破棄しています。

class Parser
  def self.parse(html)
    @data = Nokogiri.HTML(open(html))
    merged_hashes = {}

    array_of_hashes = [
      parse_department,
      parse_super_saver,
      parse_new_arrivals,
      parse_out_of_stock,
      parse_categories,
      parse_results,
      parse_category
    ]
    array_of_hashes.inject(merged_hashes,:update)

    return merged_hashes
  end

  .
  .
  .

  def self.parse_results
    results = @data.css('#refinements ul').first
    unless results
      @results_hash = {}
      return @results_hash
    end

    if results.css('li:nth-child(1) a span').text == "Pet Supplies"
      @results_hash = {}
      @results_hash[:results] ||= {}
      @results_hash[:results] = @data.at_css('#resultCount span').text[/(\S+) Results$/i, 1].delete(",").to_i
    else
      @results_hash = {}
    end

    return @results_hash
  end

この部分でわかるように:

    results = @data.css('#refinements ul').first
    unless results
      @results_hash = {}
      return @results_hash
    end

の場合、コードを停止していresultsますnil。その理由は、.at_css以下のメソッドが nil 値に適用されるとコードが壊れてしまうからです。

これは、メソッドが探している CSS セレクターが html にない場合があるために発生します。

だからこそ、そこでコードを止めたいのです。

各方法でそれを繰り返す必要があります。これを行うためのよりシンプルまたはよりエレガントな方法はありますか?

4

1 に答える 1

3

あなたはただ書くことができます

return {} if results.nil?

ただし、いくつかの提案があります。

  • 本当に設定する必要があります@results_hashか? インスタンス変数であってはならないと思うからです。def self.parse_resultsとにかくクラスメソッド ( ) を使用しています。

  • 結果を入れ子にする必要があるのはなぜ@results_hash[:results]ですか? results_hash私の意見では、直接入力するだけで十分です。results_hashそうすれば、変数を空のハッシュで一度初期化できます。

  • @results_hash[:results] ||= {}とにかく、次の行でその値をすぐに上書きするため、この行は本当に不要です。

  • Ruby は最後の式の値を暗黙的に返すので、最後のreturn. この表記法に慣れる必要がありますが、広く使用されており、一般的に「良いスタイル」と見なされています。</p>

そうは言っても、私はこの方法でメソッドを書きます:

def self.parse_results
  results_hash = {}

  results = @data.css('#refinements ul').first
  return results_hash if results.nil?

  if results.css('li:nth-child(1) a span').text == "Pet Supplies"
    results_hash = @data.at_css('#resultCount span')
                        .text[/(\S+) Results$/i, 1]
                        .delete(",")
                        .to_i
  end

  results_hash
end
于 2013-08-23T06:54:42.853 に答える