Marcio Trindade

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 a gem ou como ela 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 como ficou:

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:

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.