0.0
No commit activity in last 3 years
No release in over 3 years
Statelogic does kinda this and that... you know.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

>= 2.2.2
 Project Readme

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