0

Ich habe zwei Modelle ...# Validierungen von aktiven Datensätzen:: Wie validiert man Datumsattribute in Rails (custom_validations)?

models/Resident.rb: has_many: Blätter

models/leave.rb: belongs_to: resident

Nun, was ich Sie möchten die Modellattribute validieren, bevor sie erstellt werden.

leave.rb Attribute: start_date, end_date, Ziel

hier ist mein Urlaub Modell:

class Leave < ActiveRecord::Base 
    belongs_to :resident 
    validates :destination,presence:true 
    validates :end_date,presence: true 
    validates :start_date,presence: true 
    before_create :check_correct_leave 

    private 

    def check_correct_leave 

    if resident.hostel.hostel=='J' 
    (self.end_date - self.start_date).to_i == 4 || (self.end_date - self.start_date).to_i == 5 

    else 
    errors.add(:start_date, "Leave are granted only 4 or 5 days") 
    end 

    end 

end 

I check_correct_leave Methode auch überprüfen wollen -> wenn die Bewohner haben bereits einen Urlaub (gespeichert in einem Urlaubsmodell) von diesem einen Monat (Monat bedeutet Jan, Feb, etc) dann sollte es einen Fehler erzeugen, der:

"Sie können nicht markieren verlassen, weil Sie schon für diesen Monat markiert haben" und Modell sollte nicht speichern lassen. Danke!

Antwort

1

Sie können eine andere Validierungsmethode hinzufügen, wie diese

validate :check_leaves_in_same_month 


def check_leaves_in_same_month 
    if self.resident.leaves.where('start_date > ?', self.start_date.beginning_of_month).any? 
     errors.add("You can't mark leave cause you have already marked leave for this month") 
    end 
end 
+0

es funktioniert aber ich bin immer Flash-Fehler von meinem Controller: 'def erstellen @ leave = current_user.resident.leaves.create (leave_params) wenn @ leave.save flash [: info] = "erfolgreich markiert Leave" redirect_to leaves_path sonst flash [: danger] = "Markiere deinen Urlaub wieder (kein gültiger Urlaub)!" redirect_to new_leave_path Ende end' ** flash [: Gefahr] = "! Markieren Sie Ihre wieder verlassen (kein vaild Leave)" ** dies ein Fehler .. –

+0

, wenn Sie die Fehlermeldung angezeigt werden soll hinzugefügt, du kannst flash [: danger] in 'flash [: danger] = @ leave.errors.full_messages.first' ändern –

+0

yeah das funktioniert, aber wenn ich einen urlaub mache zeigt es mir einen fehler -> ** Du kannst ' t markiere Urlaub da du bereits für diesen Monat markiert hast ** aber der Urlaub wird in der Datenbank gespeichert !! wie man es repariert ? –

0
def has_leave_for_the_same_month? 
    resident.leaves.any? do |other_leave| 
    other_leave.start_date.month == leave.start_date.month 
    end 
end 

errors.add(...) if has_leave_for_the_same_month? 
+0

nicht funktioniert ... –

+0

http://apidock.com/ruby/Enumerable/any%3F –

+0

sollten Sie jede verwenden? Block –