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いるのですか?nilAnswer#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 に答える