<?xml version="1.0" encoding="UTF-8"?>
<code>
  <code>## Before / After / Response

class PostsController &lt; ResourceController::Base

  # block syntax
  create do
    before { @post.user = current_user }
    response do |wants|
      wants.html
      wants.js
    end
  end
  
  # chain syntax
  update.failure.wants.js
  
  # hybrid syntax
  update.failure do
    flash "There was a problem saving your object."
    wants.js
  end

end

## Alternate Model/Route/Object Naming

class PostsController &lt; ResourceController::Base
  private
    def model_name
      'blog_post'
    end
    
    def route_name
      'article'
    end
end

## Alternate find syntax

class PostsController &lt; ResourceController::Base
  private
    def object
      @object ||= end_of_association_chain.find_by_permalink(param)
    end
    
    def collection
      @collection ||= end_of_association_chain.find(:all, :page =&gt; {:current =&gt; params[:page], :size =&gt; 10})
    end
end

## Specific Actions

class PostsController &lt; ResourceController::Base
  actions :all, :except =&gt; :edit
end

## Possible Parents

class PostsController &lt; ResourceController::Base
  belongs_to :user, :category
end</code>
  <comment>Backstory on my blog: http://jamesgolick.com/2007/11/5/resource_controller-redesign-my-api-at-refactormycode-com</comment>
  <created-at type="datetime">2007-11-05T20:27:18+00:00</created-at>
  <id type="integer">137</id>
  <language>Ruby</language>
  <permalink>resource_controller-redesign-my-api</permalink>
  <refactors-count type="integer">4</refactors-count>
  <title>resource_controller: Redesign My API</title>
  <trackback-url></trackback-url>
  <updated-at type="datetime">2009-08-21T20:37:51+00:00</updated-at>
  <user-id type="integer">2</user-id>
  <refactors type="array">
    <refactor>
      <code>## Alternate Model/Route/Object Naming

class PostsController &lt; ResourceController::Base
  model_name :blog_post
  route_name :article
end</code>
      <code-id type="integer">137</code-id>
      <comment>First refactoring from my blog...</comment>
      <created-at type="datetime">2007-11-05T20:28:27+00:00</created-at>
      <id type="integer">743</id>
      <language>Ruby</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On resource_controller: Redesign My API</title>
      <user-id type="integer">2</user-id>
      <user-name>jamesgolick</user-name>
      <user-website>http://jamesgolick.com</user-website>
    </refactor>
    <refactor>
      <code>## Before / After / Response

class PostsController &lt; ApplicationController
  acts_as_resource_controller

  # block syntax
  create do
    before { @post.user = current_user }
    respond_to do |format|
      format.html
      format.js
    end
  end
  
  # chain syntax
  update.failure.respond_to %w(js html)
end

## Alternate find syntax

class PostsController &lt; ResourceController::Base
  object_finder :find_by_permalink
  collection_finder { find :all, :page =&gt; {:current =&gt; params[:page], :size =&gt; 10} }
end
</code>
      <code-id type="integer">137</code-id>
      <comment>A couple of suggestions. I'm used to the default respond_to rather then wants. And I don't know if the *_finder macros are even possible, but would look like a true dsl</comment>
      <created-at type="datetime">2007-11-05T22:24:51+00:00</created-at>
      <id type="integer">745</id>
      <language>Ruby</language>
      <rating type="integer">4</rating>
      <ratings-count type="integer">1</ratings-count>
      <title>On resource_controller: Redesign My API</title>
      <user-id type="integer">1</user-id>
      <user-name>macournoyer</user-name>
      <user-website>http://macournoyer.com</user-website>
    </refactor>
    <refactor>
      <code>update.failure.responds_to %(js html)</code>
      <code-id type="integer">137</code-id>
      <comment>I love those. The *_finder macros are definitely possible. I really like the acts_as_resource_controller too. Currently, that syntax is just resource_controller, which I'm not crazy about.

I agree with you about the respond_to, although, I think for open syntax it should be responds_to, just because it reads like english - update responds to js and html. OTOH, I don't see much of a problem with having all of these names as aliases, and so I think I'll probably do that.</comment>
      <created-at type="datetime">2007-11-05T22:42:49+00:00</created-at>
      <id type="integer">746</id>
      <language>Ruby</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On resource_controller: Redesign My API</title>
      <user-id type="integer">2</user-id>
      <user-name>jamesgolick</user-name>
      <user-website>http://jamesgolick.com</user-website>
    </refactor>
    <refactor>
      <code>  create do
    before { @post.user = current_user }
    responds_to :html, :js do |format|
      format.gif { create_gif(@post) }
    end
  end</code>
      <code-id type="integer">137</code-id>
      <comment>I prefer responds_to. Since we're on the topic, how about making the block optional?</comment>
      <created-at type="datetime">2007-11-06T01:02:40+00:00</created-at>
      <id type="integer">751</id>
      <language>Ruby</language>
      <rating type="integer">0</rating>
      <ratings-count type="integer">0</ratings-count>
      <title>On resource_controller: Redesign My API</title>
      <user-id type="integer">3</user-id>
      <user-name>danielharan</user-name>
      <user-website>http://danielharan.com/</user-website>
    </refactor>
  </refactors>
</code>
