web-dev-qa-db-ja.com

Ruby on Rails:errors.add_to_base vs. errors.add

特定の属性ではなく、オブジェクトに関連するエラーにはerrors.add_to_baseを使用する必要があることを読みました。これが何を意味するかを概念化するのに苦労しています。誰かが私がそれぞれを使いたいときの例を提供できますか?

たとえば、私にはバンドモデルがあり、各バンドにはジャンルがあります。ジャンルの存在を検証するときに、ジャンルが見つからない場合、エラーをベースに追加する必要がありますか?

例が多いほど良い

ありがとうございました!

48
Tony

ジャンルが欠落していると、フィールドエラーになります。基本エラーは、既存のレコードの完全な複製のようなもので、問題は特定のフィールドではなく、レコード全体(または少なくともフィールドの組み合わせ)に関連していました。

38
MarkusQ

これは廃止予定であることに注意する価値があります(これは検索エンジンに表示されるためです)。 Rails 3つの方法:

errors[:base] << "Error message"    

または

errors.add(:base, "Error message")

http://apidock.com/Rails/ActiveRecord/Errors/add_to_base
http://apidock.com/Rails/v3.2.8/ActiveModel/Errors/add

105
GSP

この例では、フィールド検証を確認できます(チームを選択する必要があります)。また、クラス/ベースレベルの検証を確認できます。たとえば、少なくとも1つの連絡方法、電話、またはメールが必要でした:

class Registrant
  include MongoMapper::Document

  # Attributes ::::::::::::::::::::::::::::::::::::::::::::::::::::::
  key :name, String, :required => true
  key :email, String
  key :phone, String

  # Associations :::::::::::::::::::::::::::::::::::::::::::::::::::::
  key :team_id, ObjectId
  belongs_to :team
...
  # Validations :::::::::::::::::::::::::::::::::::::::::::::::::::::
  validate :validate_team_selection
  validate :validate_contact_method
...

  private

  def validate_contact_method
    # one or the other must be provided
    if phone.empty? and email.empty?
      errors.add_to_base("At least one form of contact must be entered: phone or email" )
    end
  end

  def validate_team_selection
    if registration_setup.require_team_at_signup
      if team_id.nil?
        errors.add(:team, "must be selected" )
      end
    end
  end
end
33
Jon Kern