Independent validations met validation_scopes en validation_scenarios
Paul Engel ma 11 jan 10
Vorige week heeft Gabe da Silveira oftewel dasil003 op Github de gem validation_scopes gepubliceerd. Met behulp van deze gem is het mogelijk om scopes mee te geven aan validaties van een ActiveRecord model.
Hierdoor kun je dus nog steeds de kracht van ActiveRecord validations gebruiken voor het retourneren meldingen die alleen gelden in een bepaalde context. Merk op dat het opslaan van het object dan gewoon mogelijk is.
In onderstaand voorbeeld heeft de Film model binnen de :warnings scope een validatie die waarborgt dat de title gecapitalized moet zijn:
class Film < ActiveRecord::Base
validates_presence_of :title
validation_scope :warnings do |f|
f.validate :ensure_title_is_capitalized
f.validates_presence_of :attribute_foo
end
def ensure_title_is_capitalized
warnings.add(:title, "should be capitalized") unless title =~ %r{\A[A-Z]}
end
end
In de console:
film = Film.new(:title => "lowercase title")
film.valid?
=> true
film.no_warnings? # analogisch aan valid?
=> false
film.has_warnings? # analogisch aan invalid?
=> true
film.warnings # analogisch aan film.errors
=> #<ActiveRecord::Errors>
film.warnings.full_messages
=> ["Title should be capitalized"]
film.errors.full_messages
=> []
film.save
=> true
Wil je ook het opslaan van het object verbieden wanneer het in een bepaalde context niet voldoet aan bepaalde validaties? Dan kun je beter de plugin validation_scenarios van freetwix gebruiken.
In onderstaand voorbeeld heeft de Event model binnen de :reviewer scenario een validatie voor het verplicht invullen van de :reviewer_note attribuut.
class Event < ActiveRecord::Base
validates_presence_of :title
in_scenario :reviewer do |e|
e.validates_presence_of :reviewer_note
end
end
In de console:
event = Event.new event.save => false event.title = "RubyEnRails Conf 2010" event.save => true event.save_in_scenario(:reviewer) => false event.reviewer_note = "It rules!" event.save_in_scenario(:reviewer) => true
Update: Merk op dat validation_scenarios ook om kan gaan met state_machine. Een perfect match lijkt mij en uitermate handig!
Gepost in hor | 0 reacties
Welcome to Holland On Rails
This weblog is the official Ruby techblog from the guys at Holder, a Ruby development company. Holder is also the company behind the RubyAndRails Europe Conference in Amsterdam.Recente Jobs
Bekijk alle jobs »»
Gereedschapskist
Onmisbare tools vooriedere developer!
- Ruby On Rails
Framework voor de web 2.0 developer. Eindelijk vooruitgang! - TextMate
Editor for true pro's
Typ, tab, top :-)
Nee, niet voor Win. - Made On A Mac
En nou is het over met die saaie grijze Windows bak van je!
Auteurs op deze site
Chris Obdam
'Less is more' evangelist, past dit ook dagelijks toe op zijn tandenborstel.Chiel Wester
Snelheidswonder op Ruby wielen. Leuk om mee te pair-programmen ;-)
Plaats je reactie