我正在为名为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}
唯一的区别是第一次验证(技能)需要自定义验证,因为它是一个数组。
如何摆脱错误?
答案 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