rails自定义验证数组返回未定义的方法错误

时间:2014-03-07 15:21:35

标签: ruby-on-rails ruby validation model-view-controller ruby-on-rails-4

我正在为名为Project的模型中的属性编写自定义验证方法。这是我的代码:

def self.skill_options
  categories = Craft.all.collect{|craft| craft.label} #should change this later
  return categories
end

validate :validate_tag_list

def validate_tag_list
  puts skill_options.inspect.to_s
  puts 'validate tag list is happening'
  self.tag_list.each do |tag|
    if self.skill_options.include?(tag)
      puts tag.to_s + 'is included yo'
    else
          puts tag.to_s + 'not included yo'
          self.errors.add(:tag_list, "#{tag} is not a valid skill.")
    end
  end
end

出于某种原因,我被告知:

NameError (undefined local variable or method `skill_options' for #<Project:0x007fb6fc02ac28>)

我不确定为什么会这样。我在同一模型中对另一个名为category的属性进行了另一次验证。此验证工作完美。这是代码:

def self.category_options
  categories = Craft.all.collect{|craft| craft.label} #should change this later
end
validates :category,  inclusion: {in: category_options}

唯一的区别是第一次验证(技能)需要自定义验证,因为它是一个数组。

如何摆脱错误?

2 个答案:

答案 0 :(得分:1)

您将skill_options定义为Project类方法,因此您应该这样调用它:

Project.skill_options

因为在实例方法中,self(因此隐式接收器)是Project实例而不是类。并且Project实例未定义skill_options方法。

答案 1 :(得分:0)

Ruby可以做一些非常强大的内省。您可以使用self.class来获取当前对象的类,因为skill_options被定义为类级方法。此外,还要进行一些代码清理。对不起,忍不住了:

def self.skill_options
  Craft.pluck(:label)
end

validate :validate_tag_list

def validate_tag_list
  tag_list.each do |tag|
    unless self.class.skill_options.include?(tag)
      errors.add(:tag_list, "#{tag} is not a valid skill.")
    end
  end
end