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.
0sem comentários ainda