Hi all

I'm trying to understand, what acts_as_state_machine really does (I use
it because restful_authentication uses it).

restful_authentication defines the following stuff:

  acts_as_state_machine :initial => :pending
  state :passive
  state :pending, :enter => :make_activation_code
  state :active,  :enter => :do_activate
  state :suspended
  state :deleted, :enter => :do_delete

  event :register do
    transitions :from => :passive, :to => :pending, :guard => Proc.new
{|u| !(u.crypted_password.blank? && u.password.blank?) }
  end

  event :activate do
    transitions :from => :pending, :to => :active
  end

  event :suspend do
    transitions :from => [:passive, :pending, :active], :to =>
:suspended
  end

  event :delete do
    transitions :from => [:passive, :pending, :active, :suspended], :to
=> :deleted
  end

  event :unsuspend do
    transitions :from => :suspended, :to => :active,  :guard => Proc.new
{|u| !u.activated_at.blank? }
    transitions :from => :suspended, :to => :pending, :guard => Proc.new
{|u| !u.activation_code.blank? }
    transitions :from => :suspended, :to => :passive
  end

I played a bit with the console...

josh$ script/console
Loading development environment (Rails 2.1.0)
>> record = User.new({ :login => 'quire', :email => 'qu...@example.com', 
>> :password => 'quire', :password_confirmation => 'quire' })
=> #<User id: nil, first_name: nil, last_name: nil, login: "quire",
email: "qu...@example.com", remember_token: nil, crypted_password: nil,
password_reset_code: nil, salt: nil, activation_code: nil,
remember_token_expires_at: nil, activated_at: nil, deleted_at: nil,
state: "passive", created_at: nil, updated_at: nil>

Why is the state "passive"? Is the state of an unsaved object always
"passive"?

>> record.save
=> true
>> record
=> #<User id: 4, first_name: nil, last_name: nil, login: "quire", email:
"qu...@example.com", remember_token: nil, crypted_password:
"5670fb5c84b89d64ef405b315e4337304f88dc2b", password_reset_code: nil,
salt: "a6ff544223bf2a7653651ea7f29888a195155c8d", activation_code:
"43745d2e79d7aab4dfe2b4a3bd64d8ac577aeafe", remember_token_expires_at:
nil, activated_at: nil, deleted_at: nil, state: "pending", created_at:
"2009-04-20 20:19:15", updated_at: "2009-04-20 20:19:15">

Looks good so far... But when looking at the database entry, the
activation_code actually is NULL! Let's prove this:

>> record.reload
=> #<User id: 4, first_name: nil, last_name: nil, login: "quire", email:
"qu...@example.com", remember_token: nil, crypted_password:
"5670fb5c84b89d64ef405b315e4337304f88dc2b", password_reset_code: nil,
salt: "a6ff544223bf2a7653651ea7f29888a195155c8d", activation_code: nil,
remember_token_expires_at: nil, activated_at: nil, deleted_at: nil,
state: "pending", created_at: "2009-04-20 20:19:15", updated_at:
"2009-04-20 20:19:15">

Tadaah! This is a serious bug, isn't it? The User object only works
correct when using "register!" instead of save:

josh$ script/console
Loading development environment (Rails 2.1.0)
>> record = User.new({ :login => 'quire', :email => 'qu...@example.com', 
>> :password => 'quire', :password_confirmation => 'quire' })
=> #<User id: nil, first_name: nil, last_name: nil, login: "quire",
email: "qu...@example.com", remember_token: nil, crypted_password: nil,
password_reset_code: nil, salt: nil, activation_code: nil,
remember_token_expires_at: nil, activated_at: nil, deleted_at: nil,
state: "passive", created_at: nil, updated_at: nil>
>> record.register!
=> true
>> record.reload
=> #<User id: 5, first_name: nil, last_name: nil, login: "quire", email:
"qu...@example.com", remember_token: nil, crypted_password:
"465f2d6572f47e9adec58022d938b134e570077b", password_reset_code: nil,
salt: "293aaa4b1a391f472803767c93c07bf7966e9141", activation_code:
"1129116e89f989fee4dccb7eb38946c8e16af93a", remember_token_expires_at:
nil, activated_at: nil, deleted_at: nil, state: "pending", created_at:
"2009-04-20 20:22:03", updated_at: "2009-04-20 20:22:03">

Can anyone approve this? In my oppinion, save should have exactly the
same effect like "register!"... but it definitely doesn't.

Thanks for your opinion.
Josh
-- 
Posted via http://www.ruby-forum.com/.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to