2013-06-10 12 views
5

Ho un modello padre, che viene aggiornato tramite parametri come "@ client.update_attributes (params [: client]" .I miei parametri è una chiamata per distruggere una "scheda client 'Ho un metodo before_destroy sulla scheda client che impedisce che venga distrutto ecc. Il mio metodo before_destroy funziona, tuttavia, gli errori su before_destroy non si propagano al modello correlato quando vengono aggiornati. Qualche consiglio su come propagare questo errore del modello al modello associato quando aggiornato?prima di distruggere sull'aggiornamento del modello associato, errori non propositivi

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 

risposta

0

E 'possibile che si sta lavorando? Se l'azione di eliminazione del controller reindirizza a indice di come fa di solito, si vede mai l'errore in quanto il modello è ricaricato dal reindirizzamento.

+0

no .. ho fatto un passo attraverso con il debugger. non si tratta dell'eliminazione di client_card, è nel metodo di aggiornamento del controllore del modello principale (client). viene chiamato client.update_params e il client non ha errori (anche se i param dicono di distruggere un oggetto associato, ad es. client_card) – f0ster

2

Sospetto che validates_associated stia eseguendo solo le convalide esplicitamente dichiarate per ClientCard e non attiverà gli errori aggiunti nel callback before_destroy. La soluzione migliore potrebbe essere un callback before_update su 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 

Poi 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

Bene, non voglio impedire che il client venga aggiornato se ha client_cards con appuntamenti futuri, ma io voglio evitare che il client si aggiorni se quell'aggiornamento include una distruzione sul suo attributo nidificato di una scheda client .. allora voglio lanciare un errore se quella scheda client ha appuntamenti futuri, ecc. – f0ster

Problemi correlati