Rails Model Validation: Ich brauche validates_inclusion_of mit Groß- und Kleinschreibung falsch?
-
29-10-2019 - |
Frage
Hier ist Code, der nicht funktioniert
class WeekDay < ActiveRecord::Base
validates_inclusion_of :day, :in => %w(sunday monday tuesday wednesday thursday friday saturday), :case_sensitive => false
end
Derzeit habe ich alle Tage in db außer Sonntag.Ich versuche, "Sonntag" hinzuzufügen, und es werden Fehler angezeigt, "ist nicht in der Liste enthalten".
Lösung
validates_inclusion_of hat kein Argument für case_sensitive, sodass Sie Ihren eigenen Validator erstellen können (wenn Sie Rails 3 verwenden):
class DayFormatValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
unless %w(sunday monday tuesday wednesday thursday friday saturday).include?(value.downcase)
object.errors[attribute] << (options[:message] || "is not a proper day.")
end
end
end
und speichern Sie dies in Ihrem lib-Verzeichnis als:
lib/day_format_validator.rb
Dann können Sie in Ihrem Modell Folgendes haben:
validates :day, :day_format => true
Stellen Sie einfach sicher, dass Rails diese lib-Datei beim Start lädt, indem Sie dies in Ihre config / application.rb: einfügen
config.autoload_paths += Dir["#{config.root}/lib/**/"]
Andere Tipps
class WeekDay < ActiveRecord::Base
before_validation :downcase_fields
validates_inclusion_of :day, :in => %w(sunday monday tuesday wednesday thursday friday saturday)
def downcase_fields
self.day.downcase!
end
end
Dadurch wird das Feld vor dem Ausführen der Validierung verkleinert
Eine kleine einfache Lösung, wenn Sie sich keine Gedanken über die Trennung von Validierungen in lib machen möchten
class WeekDay < ActiveRecord::Base
validate :validate_day
def validate_day
if !self.day.nil?
errors.add(:day, "is not included in the list") unless %w(sunday monday tuesday wednesday thursday friday saturday).include?(self.day.downcase)
end
end
end