Internetbureau Holder

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

Plaats je reactie





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 voor
iedere 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 ;-) Recommend Me

Stephan Kaag

Het eerste Rails coreteam- member uit Nederland? Rails evangelist van het eerste uur.

Paul Engel

Én Rails programmeren én interfaces designen? Je zou hem superman kunnen noemen..

Dax Huiberts

Official Zip-Programmer, skinny code is helemaal zijn ding. Haalt meer code weg dan dat er bij komt.

Freek Monteban

Het nieuwste telg uit het Holland on Rails nest! Hij doet niets anders meer!

Johan Vermeulen

De stylesheet-koning uit de kop van Noord-Holland!