Frage vor dem Zerstören bei der zugehörigen Modellaktualisierung, Fehler, die nicht propagieren


Ich habe ein Elternmodell, das über Parameter wie '@ client.update_attributes (params [: client]') aktualisiert wird. In meinem params ist ein Aufruf, eine 'client_card' zu zerstören. Ich habe eine before_destroy-Methode auf der client_card, die es verhindert B. zerstört werden usw. Meine before_destroy-Methode funktioniert, die Fehler in der before_destroy-Datei werden jedoch bei der Aktualisierung nicht an das zugehörige Modell weitergegeben. Gibt es einen Hinweis darauf, wie dieser Modellfehler beim Aktualisieren an das zugehörige Modell weitergegeben wird?

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

5
2018-06-10 19:21


Ursprung


Antworten:


Ich vermute, dass validates_associated führt nur die explizit deklarierten Validierungen für ClientCard, und löst nicht die Fehler aus, die Sie in hinzugefügt haben before_destroy Rückrufen. Ihre beste Option könnte sein before_update Rückruf an 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

Dann weiter 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

2
2018-06-10 21:42



Ist es möglich, dass es funktioniert? Wenn die Löschaktion des Controllers wie üblich zum Index umleitet, wird der Fehler nie angezeigt, da das Modell von der Umleitung erneut geladen wird.


0
2018-06-10 19:39