Introduction¶ ↑
O hai!
Features¶ ↑
-
State transitions validation.
-
State-scoped validations.
-
State-scoped lifecycle callbacks (before|after_save, etc)
-
???????
-
PROFIT!!!11
As a bonus you get multiple conditions in :if|:unless => [:one, :two, ...]
callback and validation options (as in edge Rails).
Installation¶ ↑
gem install pipa-statelogic --source http://gems.github.com
Installable as a plugin too.
Docs¶ ↑
rdoc.info/projects/pipa/statelogic
Bugs & such¶ ↑
Please report via Github issue tracking.
Hint: If you feel like generous today you can tip me at tipjoy.com/u/pisuka
Example¶ ↑
class Order < ActiveRecord::Base ... statelogic :attribute => :state do # +:state+ is the default value, may be omitted # you get methods +unpaid?+ and +was_unpaid?+. # may be more than one initial state. initial_state 'unpaid' do transitions_to 'ready', 'suspended' # won't let you change to wrong states end state 'ready' do # you get +ready?+, +was_ready?+ transitions_to 'redeemed', 'suspended' validates_presence_of :txref # scoped validations before_save :prepare_for_plucking # scoped callbacks end state 'redeemed' do # likewise transitions_to 'suspended' validates_presence_of :txref, :redeemed_at, :facility_id # scoped validations end state 'suspended' do # you guess transitions_to 'unpaid', 'ready', 'redeemed' validate do |order| order.errors.add(:txref, :invalid) if order.txref && order.txref !~ /\AREF/ end end end ... end order = Order.new order.state = 'wtf' order.txref = 'orly' order.valid? # Please note that state transition checks are done during # the validation step as well, and the error is added to # the model's +errors+ collection on the state column and # will appear on your form. Standard ActiveRecord's error # message +:inclusion+ is used. Override it with Rails i18n # for something more specific if it's to be displayed to user.
Copyright © 2009 Igor Gunko, released under the MIT license