Setting a callback whose action depends on the previous stat


#1

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


#2

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


#3

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.


#4

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

blog: http://jroller.com/obie/


#5

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