使用Jekyll Hooks处理分类时出现reject方法未定义错误求助
解决Jekyll Hooks处理分类时的
undefined method 'reject'错误 错误原因很明确:你的代码里post['category']返回的是字符串类型(比如报错里的"test"),而reject是Ruby数组的方法,字符串没有这个方法,因此触发NoMethodError。
对比标签处理逻辑能发现,Jekyll中post['tags']默认是数组类型(支持多标签),所以可以直接调用reject;但category默认是单个字符串(单分类场景),因此不能直接用数组方法。
修复后的分类处理代码
Jekyll::Hooks.register :posts, :post_write do |post| all_existing_categories = Dir.entries("./src/_category") .map { |t| t.match(/(.*).md/) } .compact.map { |m| m[1] } # 把category统一转成数组,兼容单分类(字符串)和多分类(数组)场景 categories = Array(post['category']).reject { |c| c.empty? } categories.each do |category| generate_category_file(category) if !all_existing_categories.include?(category) end end def generate_category_file(category) File.open("./src/_category/#{category}.md", "wb") do |file| file << "---\nlayout: category\ncategory-name: #{category}\n---\n" end end
关键改动说明
- 统一类型为数组:用
Array(post['category'])把字符串类型的分类转为单元素数组,即使未来改成多分类(数组格式),代码也能兼容。 - 变量名优化:把原代码里的
category变量改成categories(复数),循环内用category作为单个分类的变量,避免变量名重复导致的逻辑混淆。 - 空值过滤:转成数组后再用
reject过滤空字符串,确保不会生成空分类的文件。
另外需要确认:你的分类目录是./src/_category,而Jekyll默认的分类目录是_categories(复数),如果后续生成的分类页面无法正常渲染,检查目录名是否符合Jekyll的约定。
内容的提问来源于stack exchange,提问作者Murat
相关产品推荐
相关产品推荐

