Resource Controller com template scaffold
Pra quem não conhece o resource_controller é uma gem que facilita a criação de CRUD em seus controllers criando até os 7 métodos básicos pra você dinamicamente (index, show, new, create, edit, update e destroy), se assemelha um pouco ao que o ActiveRecord faz com o model.
Você pode saber mais através da documentação ou no ótimo material disponibilizado pelo autor no github além de encontrar muita coisa nos buscadores, por este motivo que não vou entrar em muito em detalhes sobre ele e como ele funciona, mas vou explicar uma implementação que utilizei para tentar diminuir o número de views em meus projetos.
Incomodado de ficar criando o arquivo new e edit a todo momento resolvi alterar o resource controller pra renderizar um template padrão caso não encontre o template da ação que segue a conveniência do Rails. Para isso eu criei um arquivo dentro no initializer que sobrescrevi o método response_for do resource_controller adicionando um rescue para na falta do template tentar renderizar o meu template padrão, veja o código do meu resource_controller_view.rb:
module ResourceControllerView protected # Used to actually pass the responses along to the controller's respond_to method. # def response_for(action) respond_to do |wants| options_for(action).response.each do |method, block| if block.nil? wants.send(method) else wants.send(method) { instance_eval(&block) } end end end rescue ActionView::MissingTemplate render :file => "/admin/scaffold/#{name_template}", :layout => "layouts/admin" end # Set name of template # def name_template case self.action_name.to_s when "create" return "new" when "update" return "edit" else self.action_name.to_s end end end
Então no diretório admin/scaffold criei um arquivo genérico chamado new.html.erb e outro chamado edit.html.erb que por sua vez chama o partial _form dentro de cada diretório. Veja como ficou o meu new.html.erb:
<h1><%=t :new %> <%= @object.class.human_name %></h1> <%= error_messages_for @object.class.to_s.underscore.to_sym %> <% semantic_form_for(@object, :url => collection_url, :live_validations => true, :html => { :multipart => true }) do |f| %> <%= render :partial => "form", :locals => { :f => f } %> <p class="submit"><%=submit_tag t(:create)%></p> <% end %> <br/> <%= link_to t(:back), collection_url %>
Acredito que tenha uma forma melhor de escrever este código então estou esperando a sua colaboração. Não acredito que esta forma de pensar seja muito utilizada porém quando estava trabalhando com um CRUD simples facilitou bastante a criação de meus templates.