Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
A respond_to style helper for doing different actions based on which request parameters are passed.
branch: master

This branch is even with collectiveidea:master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
.bundle
lib
test
Gemfile
Gemfile.lock
MIT-LICENSE
README
Rakefile
with_action.gemspec

README

= WithAction

A respond_to style helper for doing different actions based on which request parameters are passed. Specifically, it is helpful if you want to use multiple form buttons on a page, such as "Save", "Save and Continue Editing", and "Cancel".  with_action executes different blocks based on what the presence of request parameters.

  def create
    with_action do |a|
      a.cancel { redirect_to articles_path }
      a.any do
        @article = Article.new(params[:article])
        if @article.save
          a.save { redirect_to article_path(@article) }
          a.edit { redirect_to article_path(@article) }
          a.approve do
            @article.approve!
            redirect_to article_path(@article)
          end
        else
          render :action => 'new'
        end
      end
    end
  end
  
A block is invoked if a parameter with the same name exists and is not blank.  Here is an example of a form to submit to this action:

  <%= submit_tag 'Save', :name => 'save' %>
  <%= submit_tag 'Save & Continue Editing', :name => 'edit' %>
  <%= submit_tag 'Save & Approve', :name => 'approve' %>
  <%= submit_tag 'Cancel', :name => 'cancel' %>

If an @any@ block is present and no parameter that matches one of the other blocks, it is called by default, otherwise the first block will be called. The @any@ block is the only one that can have nesting and be called multiple times.

If a block is not passed to the action, then a method with the same name is called on the controller: 

  def update
    with_action do |a|
      a.publish
      a.reject
      a.any { redirect_to root_path }
    end
  end
  
  def publish
    # …
  end
  
  def reject
    # …
  end
  
Which can be abbreviated as:

  def update
    with_action(:publish, :reject) do |a|
      a.any { redirect_to root_path }
    end
  end

(c) Copyright 2007 Brandon Keepers (brandon@opensoul.org)
Something went wrong with that request. Please try again.