Ajax Scaffold: Colunas Customizadas

2006 December 01, 06:44 h

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:

1
ajax_scaffold: user

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:

1
2
3
4
5
6
7
8
9
10
11
def logins_per_month
  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:

1
AjaxScaffold::ScaffoldColumn.new(class name, options)

O construtor do ScaffoldColumn recebe as seguinte opções:

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:

1
2
3
@@scaffold_columns = [
   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:

1
2
3
4
5
6
7
8
9
@@scaffold_columns = [
        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:

1
2
AjaxScaffold::ScaffoldColumn.new(User, { :name => "postcode", 
   :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_:

1
2
3
@@users_scaffold_columns = [
.......
]

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:

1
@@scaffold_column_totals = ['per month', 'per year']

Lembre-se de usar o prefixo se tiver mais de uma tabela por controller.

tags: obsolete rails

Comments

comentários deste blog disponibilizados por Disqus