Getting sick of writing the following?
def create @user = User.new params[:user] if @user.save redirect_to @user else render :action => :new end end def update @user = User.find params[:id] if @user.update_attributes params[:user] redirect_to @user else render :action => :edit end end
All this asking doesnt feel very OO. Objects should just know what to do.
But of course we don’t want our models knowing about the UI. So how do we create a dependency from our model to our view in a view-independent way? Let’s try simple events and procs. The only dependency will be that the observer/listener understands #call.
def create @user = User.new params[:user] @user.after_save_success do redirect_to @user end @user.after_save_failure do render :action => :new end @user.save end def update @user = User.find params[:id] @user.after_update_success do redirect_to @user end @user.after_update_failure do render :action => :edit end @user.update_attributes params[:user] end
Here I added some more events to
ActiveRecord::Base. They’re pretty self-explanatory but the names do suck.
The one thing that is different from normal AR callbacks is that these callbacks are instance specific. They should only apply to that individual user object and not all User instances. Instance specific callbacks are more in the style of prototype based OO instead of traditional class based OO.