<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://microformats.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dan+Kubb</id>
	<title>Microformats Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://microformats.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dan+Kubb"/>
	<link rel="alternate" type="text/html" href="https://microformats.org/wiki/Special:Contributions/Dan_Kubb"/>
	<updated>2026-05-03T21:37:58Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://microformats.org/wiki/index.php?title=User:Dan_Kubb&amp;diff=31833</id>
		<title>User:Dan Kubb</title>
		<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=User:Dan_Kubb&amp;diff=31833"/>
		<updated>2006-04-28T22:53:33Z</updated>

		<summary type="html">&lt;p&gt;Dan Kubb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dan Kubb [http://autopilotmarketing.com/~dan.kubb/vcard vCard]&lt;/div&gt;</summary>
		<author><name>Dan Kubb</name></author>
	</entry>
	<entry>
		<id>https://microformats.org/wiki/index.php?title=irc&amp;diff=6341</id>
		<title>irc</title>
		<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=irc&amp;diff=6341"/>
		<updated>2006-04-28T22:50:53Z</updated>

		<summary type="html">&lt;p&gt;Dan Kubb: /* People on irc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Microformats IRC =&lt;br /&gt;
&lt;br /&gt;
We have an IRC channel, [irc://irc.freenode.net#microformats #microformats on the freenode network].&lt;br /&gt;
&lt;br /&gt;
There's typically someone there at any point during the day, though there isn't always active discussion. Sometimes, though this is the best place to discuss issues that need lots of back and forth discussion.&lt;br /&gt;
&lt;br /&gt;
== People on irc ==&lt;br /&gt;
A list of IRC regulars and their normal timezones. (winter/summer)&lt;br /&gt;
&lt;br /&gt;
* [[User:Amette|amette]] (+1000)&lt;br /&gt;
* [[User:B.K._DeLong|bkdelong]] (-0500/-0400)&lt;br /&gt;
* [[User:Ben Ward|BenWard]] (+0000)&lt;br /&gt;
* [[User:BenjaminCarlyle|BenjaminCarlyle]] (+1000)&lt;br /&gt;
* [[User:Boneill|boneill]] (+0000)&lt;br /&gt;
* [[User:Brian|briansuda]] (-0600/-0500)&lt;br /&gt;
* [[User:ColinDDevroe|cdevroe]] (-0500/-0600)&lt;br /&gt;
* [[User:Cgriego|cgriego]] (-0600/-0500)&lt;br /&gt;
* [[User:ChrisCasciano|pnhChris]] (-0500/-0400)&lt;br /&gt;
* [[User:ChrisMessina|factoryjoe]] (-0800/-0700)&lt;br /&gt;
* [[User:ChristopherStJohn|cks]] (-0600/-0500)&lt;br /&gt;
* [[User:DanC|DanC]] (-0600/-0500)&lt;br /&gt;
** office hours: Wednesday afternoons, America/Chicago time&lt;br /&gt;
* [[User:Dave Cardwell|davecardwell]] (+0000)&lt;br /&gt;
* [[User:DimitriGlazkov|dglazkov]] (-0600/-0500)&lt;br /&gt;
* [[User:EdwardOConnor|hober]] (-0800/-0700)&lt;br /&gt;
* [[User:Enric|enric]] (-0800/-0700)&lt;br /&gt;
* [[User:Evan|evanpro]] (-0500)&lt;br /&gt;
* [[User:Fil|Fil]] (+0200)&lt;br /&gt;
* [[User:Hlb|hlb]] (+0800-0700)&lt;br /&gt;
* [[User:IanHickson|Hixie]] (-0800/-0700)&lt;br /&gt;
* [[User:Izo|IZO]]&lt;br /&gt;
* [[User:JoeGregorio|jcgregorio]]&lt;br /&gt;
* [[User:Jonathan_Arkell|jonnay]] (-0700/0600)&lt;br /&gt;
* [[User:Keri Henare|kerihenare]] (+1200)&lt;br /&gt;
* [http://epeus.blogspot.com/ KevinMarks] (-0800/-0700)&lt;br /&gt;
* [[User:Mark Mansour|Mark Mansour]] (+1100)&lt;br /&gt;
* [[User:neuro|neuro`]]&lt;br /&gt;
* [[User:RobertBachmann|RobertBachmann]] (+0100/+0200)&lt;br /&gt;
** Office hours: Wednesday, 20:30-21:30 UTC&lt;br /&gt;
* [[User:RyanKing|kingryan]] (-0800/-0700)&lt;br /&gt;
** [http://theryanking.com/blog/archives/2006/04/19/office-hours/ Office hours]: Wednesday, 21:00 UTC&lt;br /&gt;
* [[User:Dana Benson|Snowden]] (-0800/-0700)&lt;br /&gt;
* [[User:Steve Ganz|SteveGanz]] (-0800/-0700)&lt;br /&gt;
* [[User:Tantek|Tantek]] (-0800/-0700)&lt;br /&gt;
* [[User:Dan Kubb|dkubb]] (-0800/-0700)&lt;br /&gt;
&lt;br /&gt;
=== bots ===&lt;br /&gt;
&lt;br /&gt;
* [[mfbot]]&lt;br /&gt;
* [[mflogbot]]&lt;br /&gt;
* [http://joi.ito.com/joiwiki/JiBot jibot]&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
&lt;br /&gt;
Available here: http://rbach.priv.at/Microformats-IRC/&lt;br /&gt;
&lt;br /&gt;
== IRC meetups ==&lt;br /&gt;
&lt;br /&gt;
The idea of having IRC meetups (that is, a set time for meeting on IRC) has been suggested by [[User:RyanKing|Ryan King]], as it appears to work well for the WordPress community and may help us from time-to-time. As of yet, there are no plans to have meetups, though.&lt;/div&gt;</summary>
		<author><name>Dan Kubb</name></author>
	</entry>
	<entry>
		<id>https://microformats.org/wiki/index.php?title=rest/rails&amp;diff=6026</id>
		<title>rest/rails</title>
		<link rel="alternate" type="text/html" href="https://microformats.org/wiki/index.php?title=rest/rails&amp;diff=6026"/>
		<updated>2006-04-21T21:38:48Z</updated>

		<summary type="html">&lt;p&gt;Dan Kubb: /* RESTful Rails */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Plug-ins =&lt;br /&gt;
&lt;br /&gt;
Currently there are two different approaches to doing REST on Rails.  The first emphasizes consistency with existing Rails idioms, while the second attempts to streamline implementation of RESTful best practices.  The two hope to eventually share much of the code, but will ultimately still employ different controller architectures due to their different goals.&lt;br /&gt;
&lt;br /&gt;
== Simply RESTful ==&lt;br /&gt;
http://dev.rubyonrails.org/browser/plugins/simply_restful&lt;br /&gt;
* Inspired by:   http://pezra.barelyenough.org/blog/2006/03/another-rest-controller-for-rails/&lt;br /&gt;
&lt;br /&gt;
The primary goal of ''Simply RESTful'' is to enable developers who follow common Rails idioms to get RESTful behavior for &amp;quot;free&amp;quot;.  One major aspect of that is changing the way URLs are generate and used, according to the following conventions :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;  border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
!   HTTP verb  !!    URL  structure            !!Rails method&lt;br /&gt;
|-&lt;br /&gt;
| GET     || /items                  || index    &lt;br /&gt;
|-&lt;br /&gt;
| GET     || /items/new              || new      &lt;br /&gt;
|-&lt;br /&gt;
| POST    || /items                  || create   &lt;br /&gt;
|-&lt;br /&gt;
| GET     || /items/1                || show     &lt;br /&gt;
|-&lt;br /&gt;
| DELETE  || /items/1                || destroy  &lt;br /&gt;
|-&lt;br /&gt;
| POST    || /items/1?_method=DELETE || destroy  &lt;br /&gt;
|-&lt;br /&gt;
| GET     || /items/1;edit           || edit   &lt;br /&gt;
|-&lt;br /&gt;
| POST    || /items/1                || update   &lt;br /&gt;
|-&lt;br /&gt;
| POST    || /items/1;complete       || complete &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RESTful Rails ==&lt;br /&gt;
http://rubyforge.org/projects/restful-rails/&lt;br /&gt;
&lt;br /&gt;
Status of Desired Features:&lt;br /&gt;
* + being full support&lt;br /&gt;
* ~ being sort-of&lt;br /&gt;
* - being non-existent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;Status&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;+&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Cool URIs&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Standardized URI structure&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;+&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Method Dispatching&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Executing different code based on the URI and method&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;~&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Status Codes&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Returning the &amp;quot;best&amp;quot; HTTP status codes for methods&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Content Negotiation&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Returning the &amp;quot;best&amp;quot; content based on the client Accept* headers&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;+&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Conditional Request&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Handle the If-* headers properly and return [http://rfc.net/rfc2616.html#s10.3.5 304 Not Modified] or [http://rfc.net/rfc2616.html#s10.4.13 412 Precondition Failed] as appropriate&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;+&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Caching Headers&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Easier ways to set the Expires and Cache-Control headers&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Warnings Headers&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Possibly use them to communicate error messages in a content agnostic manner&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;+&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;OPTIONS support&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Use reflection to see what methods a URI allows so it can be reported with [http://rfc.net/rfc2616.html#s9.2 OPTIONS]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;~&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;HTTP Authentication&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;Provide an easy way to do normal [http://rfc.net/rfc2617.html Basic and Digest] (and maybe WSSE) authentication&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wish List =&lt;br /&gt;
&lt;br /&gt;
[Portions may be obsoleted due to above plug-ins solving these problems differently]&lt;br /&gt;
&lt;br /&gt;
While nominally focused on specific feature requests to add to Rails, in fact many of these recommendations are also relevant for other frameowrks, and even general &amp;quot;REX&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Columns as class names ==&lt;br /&gt;
&lt;br /&gt;
In addition to 'human_readable' column names, I'd like there to be a parameter for the equivalent 'css-friendly' representation of those columns -- and for the default templates to include that.&lt;br /&gt;
&lt;br /&gt;
== Complete, functioning, customizable web application ==&lt;br /&gt;
&lt;br /&gt;
I want to be able to do something like:&lt;br /&gt;
&lt;br /&gt;
	$ script/generate rex modelA modelB&lt;br /&gt;
&lt;br /&gt;
And get a full-blown web application which includes:&lt;br /&gt;
* the front page, including navigation links to various model objects.&lt;br /&gt;
* search boxes&lt;br /&gt;
* entry forms&lt;br /&gt;
* AHAH (ajax) responses&lt;br /&gt;
* both list- and table- oriented model representations&lt;br /&gt;
&lt;br /&gt;
The ideal is that I could use a combination of CSS and AHAH to generate the desired look, feel, and behavior of my website without actually having to touch existing HTML.  As a bonus, I also want it complete enough that I can write a REST-spider to easily discover all the valid URIs and queries.  Hey, a guy can dream...&lt;br /&gt;
&lt;br /&gt;
== XOXO instead of YAML for configuration ==&lt;br /&gt;
&lt;br /&gt;
Okay, this last one is really nit-picky, and a little odd, but it would (IMHO) be more consistent. Right now, the config is the only non-HTML, non-Ruby file, and I at least had never seen YAML before so it looked out of place.  Granted, using XHTML for config files is a little freaky at first, but when you think about it, its no worse than using custom XML tags (and way more interoperable). I'll even write the Ruby serializer myself if I have to...&lt;br /&gt;
&lt;br /&gt;
== OPTIONS Handling ==&lt;br /&gt;
&lt;br /&gt;
The controller should be able to handle OPTIONS requests&lt;br /&gt;
and know what specific methods it can handle for a given&lt;br /&gt;
URI.&lt;br /&gt;
&lt;br /&gt;
== Output Content Negotiation ==&lt;br /&gt;
&lt;br /&gt;
It would be nice to be able to have the view look at&lt;br /&gt;
the Accept headers and choose the best template to&lt;br /&gt;
output.&lt;br /&gt;
&lt;br /&gt;
For example, imagine you had the following files:&lt;br /&gt;
&lt;br /&gt;
*  index.rhtml&lt;br /&gt;
* index.rxml&lt;br /&gt;
*  index.rtxt&lt;br /&gt;
&lt;br /&gt;
If the browser sent the Accept as text/html then the&lt;br /&gt;
index.rhtml would be used.  For text/plain the&lt;br /&gt;
index.rtxt would be used, and so on.&lt;br /&gt;
&lt;br /&gt;
If there was a way for a view handler to &amp;quot;register&amp;quot;&lt;br /&gt;
itself and say what mime types it knows how to handle,&lt;br /&gt;
then the optimal handler could be chosen at runtime.&lt;br /&gt;
The handlers could do anything they want in order&lt;br /&gt;
to output the response body, including using libraries&lt;br /&gt;
like GD.&lt;br /&gt;
&lt;br /&gt;
== Input Content Negotiation ==&lt;br /&gt;
When a request has a body, it needs to be parsed and&lt;br /&gt;
stored into the request parameters.  Rails handles&lt;br /&gt;
normal web forms and multi-part form input.. but&lt;br /&gt;
it would be nice to be able to write custom handlers&lt;br /&gt;
that knows how to parse requests for specific&lt;br /&gt;
mime-types and set the appropriate request parameters&lt;br /&gt;
inside rails.&lt;br /&gt;
&lt;br /&gt;
This would allow you to POST a web form or a yaml&lt;br /&gt;
string and have the values funneled into the same&lt;br /&gt;
parameters -- your controller wouldn't care where&lt;br /&gt;
the data is come from.  I realize yaml is supported&lt;br /&gt;
by rails natively, but it should be possible to&lt;br /&gt;
register handlers for any other mime types.&lt;br /&gt;
&lt;br /&gt;
Perl's Catalyst MVC is starting to do this with&lt;br /&gt;
their HTTP::Body module.. they made it so you can&lt;br /&gt;
write custom modules to parse any mime-types and&lt;br /&gt;
set the request parameters.&lt;br /&gt;
&lt;br /&gt;
== HEAD responses ==&lt;br /&gt;
&lt;br /&gt;
Responses to HEAD requests should be identical to&lt;br /&gt;
GET requests, minus the body.  Rails should omit sending&lt;br /&gt;
the body for HEAD requests, but still send all the appropriate&lt;br /&gt;
headers.  Its especially important that the Content-Length be&lt;br /&gt;
the same for HEAD and GET responses.&lt;br /&gt;
&lt;br /&gt;
== Conditional GET requests ==&lt;br /&gt;
&lt;br /&gt;
When writing mod_perl handlers I was able to do something&lt;br /&gt;
equivalent to:&lt;br /&gt;
&lt;br /&gt;
  def get_index&lt;br /&gt;
    # do some work to set up @resource&lt;br /&gt;
    set_etag @resource.digest_hash&lt;br /&gt;
    set_last_modified @resource.updated_at&lt;br /&gt;
    return not_modified if conditional_get?&lt;br /&gt;
    render&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
This resulted in a snappier response from some apps since it&lt;br /&gt;
didn't require a full transfer if it was not modified since&lt;br /&gt;
my last request.&lt;br /&gt;
&lt;br /&gt;
== AJAX apps to use HTTP more fully ==&lt;br /&gt;
&lt;br /&gt;
Most Rails AJAX apps use only GET and POST, but they should be encouraged to use the full set of HTTP verbs in examples.&lt;br /&gt;
&lt;br /&gt;
Encouragement of Conditional GET in AJAX apps would be a bonus as well.&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
As proposed on April 1st by Charlie Savage, in response to Dan Kubb&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
The currently proposed syntax is:&lt;br /&gt;
&amp;lt;pre&amp;gt; resource :collection do |r| &lt;br /&gt;
    r.post do &lt;br /&gt;
    end &lt;br /&gt;
  end&amp;lt;/pre&amp;gt; &lt;br /&gt;
Where 'r' is an instance of a Resource class.  At first I preferred a simpler syntax, like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;  resource :collection do &lt;br /&gt;
    method.post do &lt;br /&gt;
    end &lt;br /&gt;
  end&amp;lt;/pre&amp;gt; &lt;br /&gt;
Where method represents the HTTP verb (GET, POST, PUT)?  Or maybe even:&lt;br /&gt;
&amp;lt;pre&amp;gt;  resource :collection do &lt;br /&gt;
    request.post? do &lt;br /&gt;
    end &lt;br /&gt;
  end&amp;lt;/pre&amp;gt; &lt;br /&gt;
However, do you have to have an instance of the resource class to achieve the 4 points you brought up (more details in original email):&lt;br /&gt;
# Handling OPTIONS requests.&lt;br /&gt;
# Returning 405 when appropriate&lt;br /&gt;
# Return 501 when appropriate&lt;br /&gt;
# Checking If-* request &lt;br /&gt;
&lt;br /&gt;
These all would be good features to have.  If they require having a resource class passed as &amp;quot;r&amp;quot; then I can agree to this approach.&lt;br /&gt;
&lt;br /&gt;
== Templates   ==&lt;br /&gt;
You mentioned that you'd expect these responses for different methods:&lt;br /&gt;
;GET    - 200 OK        : Response Body &lt;br /&gt;
;POST   - 303 See Other : No Response Body, Location header to newly created  resource &lt;br /&gt;
;PUT    - 303 See Other : No Response Body, Location header to resource &lt;br /&gt;
;DELETE - 303 See Other : No Response Body, Location header to collection resource &lt;br /&gt;
Using regular HTML forms I'd agree.  However, this breaks down when using XmlHttpRequest.  For example, if I do a post and it fails and I want to return an error message.  Doing a redirect is a bit silly since the URL in the browser address bar isn't going to change anyway - its easier to just return the result from the POST.  Same is true for a PUT, whether an update is successful or not.&lt;br /&gt;
Thus, I think we must provide a system where you can provide a response body regardless of the method.  One approach is Peter's proposal of just using a standardized directory structure:&lt;br /&gt;
&amp;lt;pre&amp;gt;  view&lt;br /&gt;
    my_controller&lt;br /&gt;
        resource1&lt;br /&gt;
            get&lt;br /&gt;
            put&lt;br /&gt;
       resource2&lt;br /&gt;
           post&lt;br /&gt;
          delete&amp;lt;/pre&amp;gt;&lt;br /&gt;
I like this concept.  However, maybe it would be confusing since Rails uses directories for nested classes (MyNamespace::MySubNamespace::MyController).  Thus, we could go use the name mangling I currently do now, i.e., get_resource1, or resource1_get (which I like better because it groups the templates for a resource together a bit more clearly).  &lt;br /&gt;
&lt;br /&gt;
== Editors   ==&lt;br /&gt;
We seem to be in complete agreement.  I.E:&lt;br /&gt;
;/book/1        :   Viewable representation of book #1 retrieved by GET&lt;br /&gt;
;/book/1/editor :   Editable representation of book #1, will PUT to /book/1&lt;br /&gt;
;/book/creator  :   Form to create a new book, will POST to /book&lt;br /&gt;
&lt;br /&gt;
== Top Level Resources  ==&lt;br /&gt;
Here is something Peter and I disagree about.  Do you prefer this style:&lt;br /&gt;
=== Option #1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt; def MyController&lt;br /&gt;
   resource :collection do |r|&lt;br /&gt;
      ...&lt;br /&gt;
   end&lt;br /&gt;
   resource :member do |r|&lt;br /&gt;
      ...&lt;br /&gt;
   end&lt;br /&gt;
   resource :editor do |r|&lt;br /&gt;
      ...&lt;br /&gt;
   end&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Option #2 ===&lt;br /&gt;
Or this:&lt;br /&gt;
&amp;lt;pre&amp;gt; def MyController&lt;br /&gt;
   r.get&lt;br /&gt;
      ...&lt;br /&gt;
   end&lt;br /&gt;
   r.post&lt;br /&gt;
      ...&lt;br /&gt;
   end&lt;br /&gt;
   resource :member do |r|&lt;br /&gt;
      ...&lt;br /&gt;
   end&lt;br /&gt;
   resource :editor do |r|&lt;br /&gt;
      ...&lt;br /&gt;
   end&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The difference being in the first case you insist every resource must be defined via &amp;quot;resource&amp;quot; while in the second you say that the controller is the top level resource.  When I first did my RestController I went with option #1 because it seemed more elegant.  However, I quickly changed my mind when actually writing code because it turned out to be annoying having to add the extra syntax.  This was particularly true for controllers that are just single resources.  For example, say you have geocoding functionality so you have a GeocoderController.  It does just one thing, GETs geocoding results so there is no concept of collection/member.  Thus I favor option #2 as a syntax shortcut.&lt;br /&gt;
&lt;br /&gt;
== Caching ==&lt;br /&gt;
Sounds like we've agreed that caching is important, but is not part of the Rest Controller.  Thus, you'll split that off the caching functionality into another plugin that can work with a Rest Controller.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
I see that your implementation is significantly different than mine.  I map :resource to a Ruby module, which gets included in a controller.  In contrast, you map :resource to a Ruby method.  Within that method you create an instance of a Ruby class called Resource and then execute the provided block in its context.  &lt;br /&gt;
&lt;br /&gt;
This disadvantage of my approach is that there is method renaming that goes on under the scenes, which you have to know about in order to get filters to work correctly.  The disadvantage I see to your implementation is that all the methods for a resource get mapped under a single Ruby method.  It seems that would make it hard to apply filters to specific methods.  I.E., how could I apply a filter to a GET method of the resource Member but not to the POST?  It would be great if we could use the existing filter syntax without change, but I'm guessing that might not be reasonable because now we are dealing with Resources and Methods as opposed to Actions.  Anyway, this is something I think is important to solve.&lt;br /&gt;
&lt;br /&gt;
Also, how does your Rest controller interact with the base ActionController?  I'm not seeing it being include anywhere...could you point me to the appropriate code.&lt;br /&gt;
&lt;br /&gt;
== Examples (TBD) ==&lt;br /&gt;
&lt;br /&gt;
Last, it would be good to have an example controller for people to play with.  Something simple, like a ProductController or maybe copying one of the examples from the Agile Web Development book.&lt;br /&gt;
&lt;br /&gt;
* Dan Kubb's XML.com article: http://www.xml.com/lpt/a/2006/04/19/rest-on-rails.html&lt;/div&gt;</summary>
		<author><name>Dan Kubb</name></author>
	</entry>
</feed>