2009-04-01 32 views
45

Tôi đã đọc lỗi đó.add_to_base nên được sử dụng cho các lỗi liên kết với đối tượng chứ không phải thuộc tính cụ thể. Tôi đang gặp khó khăn trong việc khái niệm hóa ý nghĩa của điều này. Ai đó có thể cung cấp một ví dụ về khi nào tôi muốn sử dụng mỗi?Ruby on Rails: errors.add_to_base so với errors.add

Ví dụ: tôi có mô hình Ban nhạc và mỗi Nhóm có một Thể loại. Khi tôi xác nhận sự hiện diện của một thể loại, nếu thể loại này bị thiếu thì lỗi có được thêm vào cơ sở không?

Các ví dụ khác càng tốt

Cảm ơn bạn!

+1

Xem câu trả lời thứ ba cho đến nay (Rails 3+) giải pháp –

Trả lời

35

Thể loại bị thiếu sẽ là lỗi trường. Lỗi cơ sở sẽ giống như một bản sao chính xác của bản ghi hiện có, trong đó vấn đề không được gắn với bất kỳ trường cụ thể nào nhưng thay vào đó là toàn bộ bản ghi (hoặc vì sợ một số trường).

31

Trong ví dụ này, bạn có thể xem xác nhận trường (nhóm phải được chọn). Và bạn có thể thấy xác nhận cấp lớp/cơ sở. Ví dụ, bạn cần ít nhất một phương thức liên lạc, điện thoại hoặc email:

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

Cảm ơn các ví dụ tuyệt vời . –

+0

niềm vui của tôi :-) Thông tin thêm về http://technicaldebt.com –

97

Nó đáng chú ý (vì đây xuất hiện trong công cụ tìm kiếm, đó là cách tôi tìm thấy nó) rằng đây là phản đối. Các Rails 3 cách để làm việc đó là:

errors[:base] << "Error message"  

hoặc

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

Người ta cũng có thể chỉ định thuộc tính trong Rails 3. 'errors.add (: name," Thông báo lỗi ")' Trích dẫn: http: //api.rubyonrails. org/classes/ActiveModel/Errors.html # method-i-add – scarver2

+3

Có lý do nào để chuyển sang mảng hoặc '# add' không? – Yogh

+0

'.add' cho phép tùy chọn và có giá trị mặc định cho thư nếu không được cung cấp. Nếu không, chúng giống hệt nhau. – GSP