2009-04-01 3 views
45

私は、errors.add_to_baseはオブジェクトに関連付けられたエラーであり、特定の属性ではないエラーに使用されるべきだと読んだ。私はこれが何を意味するのかを概念化するのに問題があります。誰かが私がそれぞれを使いたいときの例を提供できますか?Ruby on Rails:errors.add_to_base対errors.add

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

より多くの例では、より良い

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

+1

日(Railsの3+)までのための第三の回答を参照してくださいソリューションの偉大な例については –

答えて

35

ジャンルが不足しているとフィールドエラーになります。ベースエラーは、既存のレコードの正確な複製のようなものになります。問題は特定のフィールドに関連付けられず、レコード全体に(またはフィールドの組み合わせに関係なく)関係します。

31

この例では、フィールド検証(チームを選択する必要があります)が表示されます。そして、あなたはクラス/ベースレベルのバリデーションを見ることができます。たとえば、連絡先、電話や電子メールの少なくとも一つの方法を必要と:

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 
+0

感謝。 –

+0

私の喜び:-) http://technicaldebt.comの詳細 –

97

これは廃止されていること(これは私がそれを見つけた方法である、検索エンジンに表示するので)それは注目に値します。 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

+0

Rails 3で属性を指定することもできます。 'errors.add(:name、"エラーメッセージ ")'引用:http://api.rubyonrails。 org/classes/ActiveModel/Errors.html#method-i-add – scarver2

+3

配列に入れたり、 '#add'するのを好む理由はありますか? – Yogh

+0

'.add'はオプションを許可し、与えられていなければメッセージのデフォルト値を持ちます。それ以外は同じです。 – GSP