Ajax Scaffold: Colunas Customizadas
Posted on December 01, 2006
Continuando com o excelente tutorial de Scott Rutheford vamos falar agora de como ir além do básico com o Ajax Scaffold, customizando as tabelas a nosso gosto.
Colunas Customizadas
Uma das primeiras coisas que você provavelmente irá notar com o plugin Ajax Scaffold (ASp) é que ele funciona muito bem se tudo que quiser fazer é mostrar uma tabela com todos os campos que o model pode oferecer. Entretando, suponha que queremos produzir uma tabela mostrando valores que vem de métodos definidos pelo usuário no model.
Por exemplo, vamos pegar o model User com os seguintes campos: name, password, created_at, number_of_logins. Para criar a tabela que simplesmente mostra esses campos é simples, apenas adiciona o seguinte no UsersController:
mas suponha que queremos que uma das colunas contenha apenas o nome e a média do número de logins por semana (per week), por mês (per month), por ano (per year) …
Para isso codificamos 3 métodos em nosso model:
some great code
end
def logins_per_week
…
end
def logins_per_year
..
end
Agora, para fazer ASp usar essas colunas precisamos declarar um conjunto de objetos AjaxScaffold::ScaffoldColumn. O gerador do AjaxScaffold antigo faz isso no model – o plugin precisa disso no controller.
Antes de entrar nos detalhes da implementação desse exemplo, vamos dar uma rápida olhada no objeto ScaffoldColumn.
AjaxScaffold::ScaffoldColumn
Essa classe é usada internamente (apesar que vamos sobrescrevê-la em um minuto) pelo ASp (e pelo gerador) para criar as colunas que serão mostradas. Seu construtor tem a seguinte forma:
O construtor do ScaffoldColumn recebe as seguinte opções:
- name – declara a coluna no model que estamos definindo, este é o único valor obrigatório e será usado para inferir todo o resto a menos que façamos uma definição explícita.
- label – representa o nome da coluna que será mostrado. Isso será mostrado como título na tabela.
- class_name – isso declara o nome de uma classe CSS que será adicionado na declaração da coluna da classe.
- eval – é onde definimos o método que será chamado. Isso pode ser declarado como row.
, onde “row” significa o string real ou . .
- sort_sql – define a coluna da tabela que será usada para ordenação, normalmente o mesmo valod do nome da coluna SQL.
- sort – usado para definir o método de uma classe que será usado para ordenação (como logins_per_year).
Exemplo de Users (tabela única na página)
De volta ao exemplo, com apenas uma tabela na página (ou seja, sem passar a opção :suffix ao plugin), nossas colunas customizadas podem ser definidas adicionando a seguinte declaração no controller:
Array de objetos ScaffoldColumn
]
Parece bem fácil, mas e as colunas? Ok, então temos 4 colunas que queremos mostrar. O primeiro é o nome do usuário e então os 3 com nossos métodos customizados. Isso leva ao seguinte:
AjaxScaffold::ScaffoldColumn.new(User, { :name => “name” }),
AjaxScaffold::ScaffoldColumn.new(User, { :name => “per week”,
:eval => “row.logins_per_week”, :sort => ‘logins_per_week’ }),
AjaxScaffold::ScaffoldColumn.new(Report, { :name => “per month”,
:eval => “row.logins_per_month”, :sort => ‘logins_per_month’ }),
AjaxScaffold::ScaffoldColumn.new(Report, { :name => “per year”,
:eval => “row.logins_per_year”, :sort => ‘logins_per_year’ })
]
Vale a pena notar que se tinha uma associação no model User, digamos Address (Endereço, em um relacionamento), poderíamos acessar essa informação para a ordenação definindo algo como:
:eval => “row.address.postcode”, :sort => ‘address.postcode’ })
Isso funcionará para tantos níveis quantos quisermos brincar.
Exemplo de User (múltiplas tabelas na página)
Com múltiplas tabelas na mesma página (:suffix passado como true) precisamos atualizar o código acima para incluir o prefixo users_:
…….
]
Então podemos fazer a mesma coisa com qualquer outra tabela na página.
Totalizando Colunas Customizadas
Para ter calculadas e mostradas os totais de qualquer uma de nossas colunas simplesmente adicionamos um segundo array contendo os nomes das colunas que queremos totalizar:
Lembre-se de usar o prefixo se tiver mais de uma tabela por controller.
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)




