How to pass parameters to after_update callback?

Hi,

I got i.e. Ticket and TicketChange models and would like to create TicketChange object whenever Ticket object is updated.

Currently I'm creating new TicketChange in Ticket#after_update callback and simply serialize slightly modified ticket.changes hash. Ticket can be updated using 2 ways - using in-place-editors (ajax) and a form.

The problem is with updating through the form - I'd like users to be able to comment the change and upload files for each change (I'm using attachment_fu). The form is passing parameters to TicketController#update action, the ticket is updated and automagically ticket change is created as well. But how to pass the comment and file to it?

Any tips how to solve it?

Since the after_update is declared in your Ticket model, you should be able to access the params hash from the method. For example

class Ticket < ActiveRecord::Base … after_update :record_changes … private … def record_changes TicketChange.create!(params[:comment], params[:filename], …) … end end

Regards, Craig

Unless you provide the parameters to the model, any callbacks will be unable to see them. (assuming that you're talking about the parameters from a form post?)

Your models don't have direct access to params unless you explicitly pass them to the model. This would violate the MVC pattern otherwise.

Robby

D’oh. I should more carefully reply to posts after just waking up. I don’t know how I mixed controllers and models this morning. Time to enjoy the MVC public service announcements again. Sorry for the confusion everyone.

Craig

How about making two read-write attributes, one for changes and one for files, in Ticket model. They would be automatically assigned from params hash (yes you can assign any attribute using params hash, not only database related fields) and you could use them in after update method.