2013-06-10 30 views
5

Tôi có một mô hình phụ huynh, đang được cập nhật thông qua params như '@ client.update_attributes (params [: client]' .Trong params của tôi là một cuộc gọi để tiêu diệt một 'client_card Phương thức before_destroy của tôi đang hoạt động, tuy nhiên, các lỗi trên before_destroy không lan truyền đến mô hình liên quan khi được cập nhật. cho mô hình được liên kết khi được cập nhật?trước khi hủy bỏ trên cập nhật mô hình liên kết, lỗi không propogating

class Client < ActiveRecord::Base 
    has_many :client_cards, :dependent => :destroy 
    validates_associated :client_cards 

class ClientCard < ActiveRecord::Base 
    belongs_to :client, :foreign_key => 'client_id' 

    attr_accessible :id, :client_id, :card_hash, :last_four, :exp_date 

    before_destroy :check_relationships 

    def check_finished_appointments 
    appointments = Appointment.select { |a| a.client_card == self && !a.has_started } 
    if(appointments && appointments.length > 0) 
     errors.add(:base, "This card is tied to an appointment that hasn't occurred yet.") 
     return false 
    else 
     return true 
    end 
    end 

end 

Trả lời

0

Có thể nó đang hoạt động không? được tải lại bởi chuyển hướng.

+0

không .. Tôi đã bước qua với trình gỡ rối. đây không phải là xóa của client_card, nó nằm trong phương thức cập nhật của trình điều khiển (mô hình) của mô hình cha. client.update_params được gọi và client không có lỗi (mặc dù các params nói để tiêu diệt một đối tượng liên quan ví dụ client_card) – f0ster

2

Tôi nghi ngờ rằng validates_associated chỉ chạy xác thực được khai báo rõ ràng cho ClientCard và sẽ không kích hoạt các lỗi bạn đã thêm trong cuộc gọi lại before_destroy. lựa chọn tốt nhất của bạn có thể là một callback before_update trên Client:

class Client < ActiveRecord::Base 
    has_many :client_cards, :dependent => :destroy 

    before_update :check_client_cards 

    # stuff 

    def check_client_cards 
    if client_cards.any_future_appointments? 
     errors.add(:base, "One or more client cards has a future appointment.") 
    end 
    end 
end 

Sau đó, trên ClientCard:

class ClientCard < ActiveRecord::Base 
    belongs_to :client, :foreign_key => 'client_id' 

    # stuff 

    def self.any_future_appointments? 
    all.detect {|card| !card.check_finished_appointments } 
    end 
end 
+0

Vâng, tôi không muốn ngăn chặn Client được cập nhật nếu nó có client_cards với các cuộc hẹn trong tương lai, nhưng tôi muốn ngăn không cho Khách hàng cập nhật nếu cập nhật đó bao gồm phá hủy trên thuộc tính lồng nhau của client_card .. sau đó tôi muốn ném lỗi nếu client_card đó có các cuộc hẹn trong tương lai, v.v. – f0ster

Các vấn đề liên quan