Com o Rails 3 veio uma excelente novidade que é o uso do respond_to com respond_with, que se eu não me engano essa ideia veio do Merb, onde acabou deixando o controller um pouco mais enxuto, e também trazendo mais perfomance eliminando blocos necessários.
Então ao gerar um scaffold o Rails monta um controller da seguinte forma:
123456789101112
classDocumentsController<ApplicationController# GET /documents# GET /documents.xmldefindex@documents=Document.allrespond_todo|format|format.html# index.html.erbformat.xml{render:xml=>@documents}endendend
Eu eliminei as outras actions, mas sabemos que exite a repetição do bloco respond_to em todas as outras actions.
Normalmente a index responde a vários formatos, mudando o nosso controller para trabalhar com respond_to e respond_with, podemos retirar o bloco de todas as nossas actions, abaixo um exemplo:
12345678910111213
classDocumentsController<ApplicationControllerrespond_to:html,:js,:xmldefindex@documents=Document.allenddefcreate@document=Document.new(params[:document])@document.slug=SlugGenerator.new(@document.name).slugify!flash[:notice]='Document was successfully created.'if@document.saverespond_with(@document)endend
No exemplo que tem a action create temos respond_with(@document), onde a action ira redirecionar para a action show do objeto, se você quer que ele siga para outra action é so adicionar :location => url
123456
defcreate@document=Document.new(params[:document])@document.slug=SlugGenerator.new(@document.name).slugify!flash[:notice]='Document was successfully created.'if@document.saverespond_with(@document,location=>documents_url)end
É assim que mais ou menos fica um simples controller meu em Rails:
# encoding: utf-8classColorsController<AdminControllerrespond_to:htmldefindex@colors=Color.allenddefshow@color=Color.find_by_slug(params[:id])enddefnew@color=Color.newenddefedit@color=Color.find_by_slug(params[:id])enddefcreate@color=Color.new(params[:color])@color.slug=SlugGenerator.new(@color.name).slugify!flash[:notice]='Color was successfully created.'if@color.saverespond_with(@color)enddefupdate@color=Color.find_by_slug(params[:id])@color.slug=SlugGenerator.new(@color.name).slugify!flash[:notice]='Color was successfully updated.'if@color.update_attributes(params[:color])respond_with(@color)enddefdestroyflash[:notice]='Color was successfully deleted.'ifColor.find_by_slug(params[:id]).destroyrespond_with(@color,:location=>colors_url)endend
Simples e rápido, peguei um controller já pronto nesse último exemplo lol.