为什么这个小代码片段(对于带有css类的导航帮助器)在undefined method 'include?' for nil:NilClass
行上给我elseif
?
page_classes_string
可能类似于'oddchap oddchap_zoidberg oddchap_zoidberg_index'。我认为这种方法的目的很明确:
page_classes_string
中的最后一个字
page_classes_string
与当前page_string
进行比较,并返回一个包含适当类名的字符串以进行导航。我在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
答案 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}"
)。