response for lets you decorate your actions respond_to blocks
Ruby
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
spec
.gitignore
CHANGELOG
Gemfile
Gemfile.lock.development
MIT-LICENSE
README.rdoc
Rakefile
response_for.gemspec

README.rdoc

response_for

The gem is called response_for_rails

response_for (see ResponseFor::ActionController::ClassMethods) allows you to decorate the respond_to block of actions on subclassed controllers. This works nicely with github.com/ianwhite/resources_controller

response_for's functionality can be summed up in one sentence:

“response_for allows you to specify default responses for any action (or before filter) that doesn't render or redirect”

Actions typically do two things - interact with models, and render a response. The above simple idea allows you to decouple these two functions (where appropriate), which means abstraction of common patterns becomes possible.

For Rails 3.0 and higher

Simply add the response_for_rails gem to your Gemfile

gem "response_for_rails"

Older rails

For Rails 2.2 thru 2.3

For these older versions of rails please checkout the 0.2-stable-rails2.1 branch. Plugin install on rails 2.2 and up can fetch from a branch.

./script/plugin install git://github.com/ianwhite/response_for.git -r 0.2-stable-rails2.1

For Rails 2.1

cd vendor/plugins
git clone git://github.com/ianwhite/response_for.git
cd response_for
git checkout 0.2-stable-rails2.1
rmdir -f .git

For Rails 2.0

Please checkout the 0.1-stable-rails2.0 branch. Same general instructions for Rails 2.1 should work.

Run the specs

To get set up for development, do the following:

git clone git://github.com/ianwhite/response_for
cd response_for
cp Gemfile.lock.development Gemfile.lock
bundle
rake

Example

class FooController < ApplicationController
  def index
    @foos = Foo.find(:all)
    # default response - render html
  end
end

# this controller needs to respond_to fbml on index. 
# Using response_for, we don't need to repeat '@foos = Foo.find(1)'
class SpecialFooController < FooController
  response_for :index do |format|
    format.fbml { render :inline => turn_into_facebook(@foos) }
  end
end

Contributors

History

NOTE: 0.2-stable has BC-breaking API changes, and is supported only for Rails >= 2.1.x. Version 0.2.0 was released on Sept 14th 2008. You should use 0.1-stable in your existing projects until you have runs your specs and whatnot.

If you want to know more about why I changed the API in 0.2 read on

Why change the API in 0.2?

repsonse_for <= v0.1 intercepted respond_to calls to allow overriding of these by class level declarations. This turns out to have some headaches, such as:

  • If you have some bail-out code in before_filters which uses respond_to, then response_for tries to overwrite this. This meant that I had to write response_for to only kick in once before_filters had run. This made for some funky smelling code.

  • Sometimes your bail out code runs after the before_filters, in a superclass action for example, or just as part of your action (perhaps in another method). The above hack doesn't work for this case (the before_filters have run). The solution in this case was to use respond_to_without_response_for in any bail out code.

  • Conceptually, overriding code declared in methods, with code declared at the class level, is weird. Here's an example

    class FooController < SuperclassController
      response_for :index # override Superclass's index respond_to
    
      def index
        respond_to  # one might expect this to override the above, as its declared later - but it wont!
      end
    end

So, in 0.2 a much simpler idea is behind response_for - you can declare a default response for an action which will be performed if that that action has not already performed a render or redirect. This means that all of your bail out code written with respond_to will do what it's supposed to.

Rewriting for 0.2

If you're upgrading, you just need to convert any actions you want to override from this:

def index
  @things = Thing.all
  respond_to do |format|
    format.html
    format.xml { render :xml => @things }
  end
end

to this:

def index
  @things = Thing.all
end

response_for :index |format|
  format.html
  format.xml { render :xml => @things }
end

Previous Versions: 0.1

There is a branch for rails 2.0 users on this release. If you are using rails 2.0, then you want the 0.1-stable-rails2.0 branch. If you are using rails >= 2.1 then use the 0.1-stable branch