只有当问题类型为“选择”或“复选框”时,我才需要验证标题的存在:
class Answer < ActiveRecord::Base
belongs_to :question
attr_accessible :title
validate :need_title?
private
def need_title?
errors.add(:need_title, "")) if
((question.type_of_answer == 'select' || question.type_of_answer == 'checkboxes') && title.blank?)
end
end
class Question < ActiveRecord::Base
has_many :answers
accepts_nested_attributes_for :answers, :allow_destroy => true
validates_presence_of :title
end
但是当我创建对象时,我得到了这个例外:
NoMethodError: undefined method `type_of_answer' for nil:NilClass
为什么question
在验证过程中nil
为Answer#need_title?
?
答案 0 :(得分:4)
我假设您正在使用嵌套答案创建问题。对于新创建的答案,其question
关联为nil
。这是一个老问题addressing the root cause。
以下是使用自定义构建方法设置父对象的方法:
class Question < ActiveRecord::Base
has_many :answers do
def build(*args)
answer = super
answer.question = self.proxy_owner
answer
end
end
# ...
end
当从嵌套属性构造新答案时,这应该指定反向关联(从答案到问题),并且验证器将按预期得到非零question
。