How to pass parameters to after_update callback?


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


def record_changes
TicketChange.create!(params[:comment], params[:filename], …)



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.


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.


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