Ir para o conteúdo
ou

Software livre Brasil

 Voltar a Blog
Tela cheia

Resource Controller with Views

31 de Julho de 2009, 0:00 , por Software Livre Brasil - 0sem comentários ainda | Ninguém está seguindo este artigo ainda.
Visualizado 718 vezes

Uma das vantagens em usar o padrão REST é que os controllers da aplicação ficam padronizados. Isso permite que criemos classes base ou outras formas de não repetirmos o código quando estamos desenvolvendo um novo controller em uma aplicação Web.

Resource Controller

O resource_controller é um plugin para o Rails que oferece exatamente isso: a implementação das actions para um controllers RESTful.

Com ele, um controller como aquele que você já deve ter gerado com o gerador de scaffold padrão do Rails se resume a basicamente isso:

class UsersController < ResourceController::Base
end

Mas o plugin não só fornece essa classe base com as actions implementadas, como também um bocado de forma de customizá-las, como por exemplo, criar alterar as mensagens de flash, o tipo de view que a action responderá, criar recursos aninhados, filtros, etc... tudo que você pode encontrar no README do projeto. (Adoro esses projetos que bastam uma página de documentação.)

Sendo assim, fica faltando somente as views...

Views

Depois de criar, recriar e renomear o projeto umas quinnhentas vezes, resolvi simplesmente fazer um fork do resource_controller e acrescentar a funcionalidade que eu gostaria: fornecer um conjunto de views básicas, como aquelas geradas pelo scaffold padrão, e uma forma simples de personalizá-las. (Afinal de contas, quem sabe o James Golick não aceita essas mudanças. :) ).

Quando você instala o resource_controller_with_views, ele cria o diretório app/views/scaffold com os templates para as views do controller. Além dos nomes (index, new, edit, show, _form), também preferi manter o conteúdo das views semelhante ao do scaffold padrão. Isso faz com que os usuários se sintam mais familiarizados com elas e, consequentemente, mais fácil de personalizá-las.

Personalização

Para alterar os templates você pode mexer à vontade nos arquivos do app/views/scaffold. Se você quiser alterar uma view de um controller, você pode copiar desse mesmo diretório ou criá-la do zero.

Entretanto, depois de estabelecido como vão ser as views do scaffold, nós queremos muitas vezes apenas informar como um campo deve ser exibido ou que campos devem aparecer em cada tela do scaffold.

Para facilitar esse tipo de customização mais pontual você pode criar métodos no helper do controller, como o seguinte exemplo:

module UsersHelper
  include ResourceController::Helper

  def columns
    ['login', 'name']
  end
end

Depois de incluir no helper o módulo ResourceController::Helper, você poderá usar alguns métodos mágicos.

O método columns será usado para definir quais colunas serão utilizadas no scaffold, ou seja, em todas as views do controller Users exibirão apenas os campos login e name.

Para especificar os campos apenas para action index, defina o método index_columns; para os campos da action show defina show_columns; e para as actions new e edit defina form_columns.

Um dica: se você quiser aproveitar a configuração padrão para remover ou alterar alguns campos, você pode usar o super e os operadores + e - do Array:

module UsersHelper
  include ResourceController::Helper

  def columns
    ['login', 'name']
  end

  def form_columns
    super + %(password password_confirmation)
  end
end

Existe também um atalho para esses métodos:

module UsersHelper
  include ResourceController::Helper

  columns :login, :name
  form_columns :login, :name, :password, :password_confirmation
end

Para definir como um campo deve aparecer, nas views index e show basta definir um método <nome_da_coluna>_column. E para definir como ele deve aparecer no formulário, defina um método <nome_da_coluna>_form_column. Crédito para o ActiveScaffold pela bela sacada.

  module UsersHelper
    include ResourceController::Helper

    def website_column(user)
      autolink user.website
    end

    def about_form_column(form, user)
      form.textarea 'about', :rows => 3
    end

    def level_id_form_column(form, user)
      form.select 'level_id', Level.all.collect {|l| [l.description, l.id ]}, { :include_blank => true })
    end
  end

Também tempos alguns atalhos para isso:

  module UsersHelper
    include ResourceController::Helper

    password_field :password
    password_field :password_confirmation
    textarea       :about, :rows => 3
    select         :level_id, Level.all.collect {|l| [l.description, l.id ]}, :include_blank => true
  end

Você pode usar essas macros para todos os métodos do FormHelper, exceto para os métodos form_for e fields_for.

Pronto, é só isso que esse _with_views trouxe de novidade ao resource_controller. E se você tiver alguma sugestão para esse projeto, por favor a faça. ;)


Fonte: http://blog.dolucas.com/resource-controller-with-views

0sem comentários ainda

Enviar um comentário

Os campos são obrigatórios.

Se você é um usuário registrado, pode se identificar e ser reconhecido automaticamente.