局部变量是nil,当它显然不应该(指定给自己的表达式)

时间:2013-02-06 01:52:19

标签: ruby middleman

为什么这个小代码片段(对于带有css类的导航帮助器)在undefined method 'include?' for nil:NilClass行上给我elseif

page_classes_string可能类似于'oddchap oddchap_zoidberg oddchap_zoidberg_index'。我认为这种方法的目的很明确:

  1. 如果它包含'_index'
  2. ,请删除page_classes_string中的最后一个字
  3. page_classes_string与当前page_string进行比较,并返回一个包含适当类名的字符串以进行导航。
  4. 我在irb中尝试了这个代码,当然它可以工作,但不在我的中间人配置中。我也可以使用第三个变量来重写它,它被赋予了我的`page_classes_string',但这看起来很麻烦。有什么建议吗?

    当然,附加到以下变量名称的_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
    

1 个答案:

答案 0 :(得分:1)

我建议删除page_classes_string并简单地创建一个新类来保存你的css类。根据您当前生成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}")。