-1

この小さなコード スニペット (css クラスを使用したナビゲーション ヘルパーの場合)が-lineundefined method 'include?' for nil:NilClassを表示するのはなぜですか?elseif

これpage_classes_stringは、「oddchapoddchap_zoidbergoddchap_zoidberg_index」のようなものかもしれません。このメソッドの目的は明らかだと思います。

  1. page_classes_string「_index」が含まれている場合は、最後の単語を削除します
  2. page_classes_stringを現在のものと比較し、page_stringナビゲーションに適したクラス名を持つ文字列を返します。

このコードをirbで試してみましたが、もちろん動作しますが、仲介者の設定では動作しません。また、「page_classes_string」が割り当てられる 3 番目の変数を使用してそれを書き直すこともできますが、それはちょっと面倒に思えます。助言がありますか?

もちろん、_string次の変数名に付けられた は、明確化のみを目的としています。

def nav_active(page_string)
  if page_classes_string.match(/_index/)
    page_classes_string = page_classes_string.split(/ /)[0..-2].join(' ')
  end

  if page_classes_string == page_string
    'active'
  elsif page_classes_string.include? page_string
    'semiactive'
  else
    nil
  end
end
4

1 に答える 1

1

を取り除き、page_classes_stringcssクラスを保持するための新しいクラスを作成することをお勧めします。現在どのように生成しているかにもよりますがpage_classes_string、これがあまりにも破壊的であるとは思いません。

class PageClassCollection
  attr_reader :css_classes

  def initialize(*classes)
    @css_classes = classes
  end

  def to_s
    css_classes.join(' ')
  end

  def non_index_classes
    css_classes.select {|c| !c['_index']}
  end

  def nav_active?(page_string)
    return 'active' if non_index_classes == [page_string]
    return 'semiactive' if non_index_classes.include? page_string
    nil
  end
end

次のように使用します。

page_classes = PageClassCollection.new('oddchap', 'oddchap_zoidberg', 'oddchap_zoidberg_index')
page_classes.nav_active?('oddchap') #=> 'semiactive'

それでも文字列に変換する必要がある場合は、それを.to_s処理します(たとえば、文字列補間を使用すると自動的に呼び出されます"#{page_classes}")。

于 2013-02-06T04:22:03.660 に答える