Forum: Ruby on Rails Setting a callback whose action depends on the previous stat

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Maurice G. (Guest)
on 2007-07-08 01:50
(Received via mailing list)
I've been reading about ActiveRecord::Callbacks and they're really
cool. But I have a complex need I'm not sure they answer.

Let's say we have a User model. User has a #status attribute, which
can be either "active", "closed" or "blocked".

I want to set a callback to perform an action if an "active" User has
been blocked. So I need to know:

1. That the user has at first been in "active" status.
2. That his status has been set to "blocked".

I need to set the callback when someone tries to save him in this
state, so to sum up:

I need to run some logic when someone updates a user.status from
'active' to 'blocked'.

Any idea how?

--
Maurice B. Gladwell
Rob B. (Guest)
on 2007-07-08 20:56
(Received via mailing list)
On Jul 7, 2007, at 5:49 PM, Maurice G. wrote:
> state, so to sum up:
>
> I need to run some logic when someone updates a user.status from
> 'active' to 'blocked'.
>
> Any idea how?
>
> --
> Maurice B. Gladwell

Thinking completely off the top of my head (e.g., none of this has
actually been run), I'd say you could hook into the status writer and
set a flag for later use in a before_save callback.

before_save :handle_newly_blocked

def status=(new_status)
   if self.status == 'active' && new_status == 'blocked'
     @newly_blocked = true
   end
   write_attribute(:status, new_status)
end

def handle_newly_blocked
   if @newly_blocked
     #  .. handle it ..
   end
end


-Rob

Rob B.    http://agileconsultingllc.com
removed_email_address@domain.invalid
Matthew Rudy J. (Guest)
on 2007-07-09 00:59
Maurice G. wrote:
> I've been reading about ActiveRecord::Callbacks and they're really
> cool. But I have a complex need I'm not sure they answer.
>
> Let's say we have a User model. User has a #status attribute, which
> can be either "active", "closed" or "blocked".
>
> I want to set a callback to perform an action if an "active" User has
> been blocked. So I need to know:
>
> 1. That the user has at first been in "active" status.
> 2. That his status has been set to "blocked".
>
> I need to set the callback when someone tries to save him in this
> state, so to sum up:
>
> I need to run some logic when someone updates a user.status from
> 'active' to 'blocked'.
>
> Any idea how?
>
> --
> Maurice B. Gladwell

I don't know how you are going to use this function,
but maybe you're going to use it this way.

A user presses the "block" button.
this calls the "block!" method on the user,
execute whatever code you need.
Jodi S. (Guest)
on 2007-07-09 01:12
(Received via mailing list)
On 8-Jul-07, at 4:59 PM, Matthew R. wrote:

>>
>>
>> --
>> Maurice B. Gladwell
>
> I don't know how you are going to use this function,
> but maybe you're going to use it this way.
>
> A user presses the "block" button.
> this calls the "block!" method on the user,
> execute whatever code you need.
>

Although your example is a simple state machine, I am a big fan of
acts_as_state_machine.

http://lunchroom.lunchboxsoftware.com/2006/1/21/ac...

Jodi
Obie F. (Guest)
on 2007-07-21 20:42
(Received via mailing list)
Sorry for the late response, but I couldn't resist telling you to look
at the acts_as_state_machine plugin. It lets you program transition
logic like you're describing declaratively.

On 7/7/07, Maurice G. <removed_email_address@domain.invalid> wrote:
> 1. That the user has at first been in "active" status.
> --
> Maurice B. Gladwell
>
> >
>


--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Pre-order my book The Rails Way
http://www.amazon.com/dp/0321445619

blog: http://jroller.com/obie/
This topic is locked and can not be replied to.