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¶ ↑
-
Ian White github.com/ianwhite
-
Josh Goebel github.com/yyyc514
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