Começando com o Plugin Ajax Scaffold
Posted on December 01, 2006
Este excelente artigo foi retirado (eu sei, eu sei, …) do blog Life On (And Off) The Tracks, de Scott Rutherford. Já mencionei tanto o Streamlined quanto o AjaxScaffold aqui no blog. O que mudou de lá para cá é que antes ele gera um generator e agora é um plugin. Mesmo assim continua extremamente simples de usar e os resultados são impressionantes. Que tal demonstrar a seus colegas a geração de uma formulário com Ajax e tudo em poucos minutos?
obs: este artigo exige como pré-requisito que você já tenha alguma prática – mesmo que básica – em usar o Rails. Que conheça os principais diretórios, os principais geradores e saiba onde mexer no básico de Models, Views e Controllers do Rails.
Instalação
A maneira mais fácil de instalar a versão plugin do Ajax Scaffold (AS) é usar o instalador que vem no Rails. Simplesmente rode o seguinte comando a partir da raíz do seu projeto Rails:
Isso fará download do plugin no diretório “vendor/plugins”. Os arquivos necessários (views, css e js) serão copiados ao aplicativo durante seu reinício.
Uso Básico
Com o plugin instalado simplesmente adicione a seguinte linha:
ao topo de qualquer classe ActionController. Isso resultará na criação de todos os métodos CRUD requeridos pelo grande front end de Richard White .
Então incluia isto em seu layout:
Voilá!! A tabela AS completa estará disponível no endereço http://servidor/meu_controller/ (claro, substitua “servidor” pelo seu servidor – normalmente localhost:3000 – “meu_controller” pelo nome do seu controller que foi modificado acima).
Como exemplo – digamos que queremos criar uma administração de usuários. Primeiro, geramos o model de usuários:
Então criamos a tabela de usuários no banco de dados usando o seguinte migration:
t.column “name”, :string, :limit => 255, :null => false
t.column “password”, :string, :limit => 255, :null => false
t.column “created_at”, :datetime, :null => false
t.column “updated_at”, :datetime, :null => false
end
Agora geramos o controller:
Abra o arquivo do controller, users_controller.rb e adicione a inclusão do plugin:
ajax_scaffold :user
end
Crie um arquivo de layout chamado users.rhtml:
PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”
“DTD/xhtml1-strict.dtd”>
Inicialize o Webrick (ou outro servidor que você esteja usando como Lighty ou Mongrel), aponte seu browser favorito (Firefox, claro) para http://localhost:3000/users e … você deve ver isto:

Agora podemos ir adiante e usar essa interface. Claro, na vida real ter senhas gravadas como texto puro seria uma má idéia, além disso não colocamos nenhuma validação no model, mas acho que todos já entenderam a idéia.
Opções
Então agora você tem uma tabela, e o que mais ela pode fazer? Ok, existem algumas opções que podem ser passadas ao plugin e que adicionam comportamento e aparência. Ele são:
- except- isso recebe um array com um desses strings: “create”, “edit”, “delete” e previne a geração dos métodos correspondentes. Isso também remove os respectivos elementos de serem mostrados na tabela. O exemplo a seguir cria um controller sem métodos create e delete:
ajax_scaffold :user, :except => [‘create’, ‘delete’]
- width – isso recebe um número representando o tamanho em pixels da tabela gerada. O exemplo a seguinte cria uma tabela de 500px de comprimento:
ajax_scaffold :user, :width => 500
- rel_width – isso recebe um número entre 0 e 1 representando o tamanho relativo da tabela ao elemento que o contém. O exemplo a seguir produz um tabela com 70% de tamanho em relação ao seu contâiner:
ajax_scaffold :user, rel_width => 0.7 produces a table of 70% width
- rows_per_page – isso indica o número máximo de linhas mostradas antes da paginação.
ajax_scaffold :user, :rows_per_page => 10
- totals – isso recebe um array de strings representando os nomes e colunas que você gostaria de totalizar. Se não for nula, esta opção adiciona uma linha de totais ao final da tabela. O exemplo a seguir produz uma linha mostrando o número total de logins para todos os usuários na página (assumindo que nosso model tenha um campo incrementável chamado login_cnt, veja outro exemplo depois):
ajax_scaffold :user, :totals => [‘login_cnt’]
- suffix – isso emula a opção de sufixo do scaffold do Rails e quando configurado para “true”, gera todos os métodos específicos ao model, permitindo múltiplas tabelas de serem colocadas dentro de um único controller (veja a seção a seguir)
Múltiplos Scaffolds em uma Página
Existem duas maneiras de colocar múltiplas tabelas em uma única página. A primeira (e provavelmente a maneira mais REST/CRUD) é criar um controller para cada model que quiser ter uma tabela. Configure cada tabela como requerido usando as opções do método ajax_scaffold e então simplesmente inclua cada tabela em um único arquivo rhtml usando uma chamada ao render para mostrar componentes:
:action => ‘table’, :params => params >
<= render_component :controller => ‘/articles’,
:action => ‘table’, :params => params >
<= render_component :controller => ‘/pages’,
:action => ‘table’, :params => params %>
Entretanto, se não quiser ir por esse caminho. Digamos que apenas queira um controller admin para administrar seus models e usuários, artigos e páginas. Isso pode ser feito em um único arquivo. Simplemente crie um controller “admin” e declare cada model com um ajax_scaffold separado. Garanta de passar opção “suffix => true”:
ajax_scaffold :user, :rows_per_page => 3,
:suffix => true, :width => 500
ajax_scaffold :article, :except => [‘edit’],
:suffix => true, :rel_width => 0.4
ajax_scaffold :page, :except => [‘delete’],
:rows_per_page => 10, :suffix => true, :width => 400
def index
end
end
A página de índice (não se esqueça de adicionar o método index) então vai se parecer um pouco diferente, com as chamadas a tabelas agora usando um prefixo do nome do model:
:action => ‘users_table’, :params => params >
<= render_component :controller => ‘/admin’,
:action => ‘articles_table’, :params => params >
<= render_component :controller => ‘/admin’,
:action => ‘pages_table’, :params => params %>
Essa configuração (com um pouco de dados adicionados) lhe dará:

Colunas Totalizadas
Agora suponha que você queira adicionar totais para a coluna “views” nas tabelas de artigos e páginas. Simples. Apenas mude a declaraçao no controller para:
ajax_scaffold :article, :except => [‘create’,‘edit’],
:suffix => true, :rel_width => 0.4, :totals => [‘views’]
ajax_scaffold :page, :except => [‘delete’],
:rows_per_page => 5, :suffix => true,
:width => 500, :totals => [‘views’]
def index
end
end
Agora teremos (note que o método create foi derrubado da tabela de artigos):

Customizando a View
Durante o início da aplicação, o plugin cria um diretório chamado ajax_scaffold em app/views. Ele contém todas as views requeridas pelo AS. Se quiser mudar um dos templates, simplesmente copie para o diretório de views apropriado e o atualize lá.
A caminho de procura utilizado pelo plugin é o seguinte:
- app/views/
- app/views/
- app/views/ajax_scaffold
Então, para nosso exemplo com um controller admin e então models user, article e pages, poderíamos ultrapassar a table.rhtml para todas as tabelas mostradas colocando nosso template customizado em “app/views/admin”. Então poderíamos ter um formulário específico para user colocando form.rhtml em “app/views/user”. Os models article e pages continuariam a usar o formulário de app/views/ajaxscaffold.
blog comments powered by Disqus
Archives
- February 12(2)
- December 11(1)
- November 11(4)
- October 11(6)
- September 11(5)
- August 11(1)
- July 11(5)
- May 11(4)
- April 11(11)
- March 11(4)
- February 11(3)
- January 11(4)
- December 10(9)
- November 10(2)
- October 10(10)
- September 10(4)
- August 10(6)
- July 10(14)
- June 10(16)
- May 10(8)
- April 10(14)
- March 10(9)
- February 10(6)
- January 10(14)
- December 09(10)
- November 09(10)
- October 09(7)
- September 09(19)
- August 09(4)
- July 09(12)
- June 09(7)
- May 09(12)
- April 09(11)
- March 09(9)
- February 09(9)
- January 09(12)
- December 08(14)
- November 08(20)
- October 08(15)
- September 08(18)
- August 08(25)
- July 08(13)
- June 08(21)
- May 08(29)
- April 08(27)
- March 08(12)
- February 08(32)
- January 08(31)
- December 07(27)
- November 07(30)
- October 07(25)
- September 07(28)
- August 07(16)
- July 07(15)
- June 07(16)
- May 07(7)
- April 07(13)
- March 07(8)
- February 07(9)
- January 07(24)
- December 06(17)
- November 06(17)
- October 06(15)
- September 06(38)




