---
title: less asking, more telling
teaser:
tags: web,rails,good code
author: Jared Carroll
published_on: 2008-02-25
---

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.
