refactor respond_to block

Rails 3.1.3

My controller has many similar codes so I want to refactor them.

      respond_to do |format|
        if @plan.save
          format.html { redirect_to '/mypage', notice:
i18n_field(:match_exist) } ###HERE!!!!!
          format.json { render json: @plan, status: :created, location:
@plan }
        else
          format.html { render action: "new" }
          format.json { render json: @plan.errors, status:
:unprocessable_entity }
        end
      end

...
      respond_to do |format|
        if @plan.save
          format.html { redirect_to '/mypage', notice:
i18n_field(:plan_create_success) } ###HERE!!!
          format.json { render json: @plan, status: :created, location:
@plan }
        else
          format.html { render action: "new" }
          format.json { render json: @plan.errors, status:
:unprocessable_entity }
        end
      end

The only difference is "i18n_field(... )" parts as you can see.

How would you refactor them ?

Thanks!

soichi

My controller has many similar codes so I want to refactor them.

      respond_to do |format|
        if @plan.save
          format.html { redirect_to '/mypage', notice:
i18n_field(:match_exist) } ###HERE!!!!!
          format.json { render json: @plan, status: :created, location:
@plan }
        else
          format.html { render action: "new" }
          format.json { render json: @plan.errors, status:
:unprocessable_entity }
        end
      end

(and the same except a different symbol instead of :match_exist)

How would you refactor them ?

Make a private method that accepts the thing you want to match. (Just
like any other "extract what's common and parameterize it" sort of
refactoring. Sorry I'm not familiar with the semi-official names of
the common refactorings.) So, you'd wind up with something like:

  class PlansController < ApplicationController

    def one_action
      save_with_varied_notice params, :match_exist
    end

...

    def another_action
      save_with_varied_notice params, :plan_create_success
    end

  private

    def save_with_varied_notice params, match_symbol
      # insert here whatever it is you do to find or make @plan
      respond_to do |format|
        if @plan.save
          format.html { redirect_to '/mypage',
                         notice: i18n_field(:match_symbol) }
          format.json { render json: @plan, status: :created,
                         location: @plan }
        else
          format.html { render action: "new" }
          format.json { render json: @plan.errors,
                         status: :unprocessable_entity }
        end
      end
    end

  end

Nice and DRY now. Did you see what I did there?

-Dave