2

仅当问题类型为“选择”或“复选框”时,我才需要验证标题的存在:

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?

4

1 回答 1

4

我假设您正在使用嵌套答案创建问题。对于新创建的答案,它的question关联是nil这是一个解决根本原因的老问题。

以下是使用自定义构建方法设置父对象的方法:

class Question < ActiveRecord::Base
  has_many :answers do
    def build(*args)
      answer = super
      answer.question = self.proxy_owner
      answer
    end
  end

  # ...
end

当从嵌套属性构造新答案时,这应该分配反向关联(从答案到问题),并且您的验证器将按question预期得到非 nil。

于 2012-09-14T19:32:14.793 回答