RESTful Rails
Geplaatst door Matthijs Langenberg do, 02 nov 2006 07:18:00 GMT
In de komende release van Rails gaat REST een belangrijke rol spelen, maar wat is REST nu eigenlijk?
REST staat voor REpresentational State Transfer, dit betreft het opvragen en wijzigen van resources waarbij gebruik wordt gemaakt van de vier standaard HTTP request methoden (namelijk:GET, POST,
PUT en DELETE). REST is gebaseerd op het feit dat elke HTTP methode een te ondernemen actie op
een resource (een ‘model’) vertegenwoordigt. Dit maakt het mogelijk om dezelfde URL voor meerdere acties te gebruiken.
Stel dat ik het eerste artikel van een blog zou willen opvragen: 
 GET /articles/1  DELETE /articles/1 | HTTP verb | Controller Action | CRUD Action | 
| GET | show | READ | 
| POST | create | CREATE | 
| PUT | update | UPDATE | 
| DELETE | destroy | DESTROY | 
    class TasksController < ApplicationController
        def index
            @tasks = Taks.find(:all)
        end
        def show
            @task = Task.find(params[:id])
        end
        def close
            @task = Task.find(params[:id])
            @task.close!
        end
    end    class ClosuresController < ApplicationController
        def create
            @task = Task.find(params[:task_id])
            @task.close!
        end
    endPOST tasks/1/closures request uit te voeren.
Het is dus belangrijk dat je (de wereld) probeert te modelleren binnen CRUD acties wil je RESTful controllers implementeren.
Dit zorgt er tevens voor dat het aantal acties binnen een controller drastisch verminderd en je controller een opbouw heeft die vele 
malen consistenter is.
Iets anders wat nu ook goed aangepakt kan worden is het gebruik van meerdere acties voor alternatieve weergaven van dezelfde informatie,
misschien komt het volgende bekend voor:
    class ArticlesController < ApplicationController
        def show
            @article = Article.find(params[:id])
        end
        def show_rss
            @article = Article.find(params[:id])
            render :rss => @article.to_rss
        end
        def show_atom
            @article = Article.find(params[:id])
            render :atom => @article.to_atom
        end
        def show_xml
            @article = Article.find(params[:id])
            render :xml => @article.to_xml
        end
        def show_ajax
            @article = Article.find(params[:id])
            render :template => show_article.rjs
        end
    end@article  = Article.find(params[:id]) is namelijk ook in elke actie aanwezig.
Waar je dus naar toe zou willen gaan is het gebruik van 1 actie, waar op basis van het request type informatie
op een bepaalde wijze weergegeven wordt. Hiervoor kan de Accept Header in HTML gebruikt worden, 
maar ook de ‘extensie’ van de request, bijvoorbeeld GET /articles.html of GET /articles.rss
Dit is in Rails te doen door de respond_to methode aan te roepen, dit ziet er als volgt uit:
    class ArticlesController < ApplicationController
     def show
       @article = Article.find(params[:id])
       respond_to do |format|
         format.html
         format.rss  { render :rss => @article.to_rss }
         format.atom { render :atom => @article.to_atom }
         format.xml  { render :xml => @article.to_xml }
         format.rjs  { render :template => ‘show_article.rjs’ }
       end
     end
    endEen stuk netter is het niet?
Nu ik de theorie achter REST (binnen Rails) kort uitgelegd heb, zal ik in een volgend artikel een handleiding schrijven waarin ik een voorbeeld applicatie volgens de REST methode opzet. We gaan daar ook echte ondersteuning voor REST webservices inbouwen zodat we deze vanaf een andere rails applicatie kunnen aanroepen.

Ik denk dat:
Eigenlijk moet zijn:
Toch?
Verder: een leuk artikel, verhelderend. Ik was me alleen niet duidelijk of die ‘close’ actie nu een task moet sluiten, of dat het iets anders moet doen.
Dank! Aangepast.
@Erik: Het doel van de close actie is in dit geval inderdaad het sluiten van een taak, stel je een takenlijst voor waarbij taken ook afgevinkt (closed) kunnen worden.
2 foutjes..
Aangezien requests binnenkomen bij een controller houd dit dus in dat er een mapping plaatsvind van HTTP methode…
zou moeten zijn..
Aangezien requests binnenkomen bij een controller houdt dit dus in dat er een mapping plaatsvindt van HTTP methode…