Setting a callback whose action depends on the previous stat

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

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
[email protected]

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.

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. [email protected] 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: Best Online Casino in Australia | Top Licensed Casinos for Gamblers

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/acts-as-state-machine

Jodi