terça-feira, 29 de setembro de 2009

Rails - Editando o CSS do seu formário uma unica vez

1

Acredito que todo o desenvolvedor tenha alguns problemas com CSS, ou de esquecer um maldito campo, e ele ficar sem o layout, muitas vezes, todos os campos são renderizados de maneira diferente, de acordo com a definição do designer, ou da equipe.
Normalmente o saco, é por exemplo em rails criar um form da seguinte maneira


- form_for(@foo) do |f|
%p= f.error_messages
%table
%tr
%td= f.label 'Nome:'
%td= f.text_field :name, :class => :atext_field
%tr
%td= f.label 'Descrição:'
%td= f.text_area :description, :class => :atext_area
%tr
%td= f.submit 'Salvar'

PS: Esse código foi escrito em HAML. é bem simples modifica-lo para ERB.
O que vemos é que existem dois campos com a tag :class, que indica a classe do componente para o Rails renderizar na tela. Eis que nessa tela imagine mais uns 10 text_field, e outras páginas de cadastro com quantidades semelhantes de campos. Ai o desgraçado do design resolve mudar o layout (não me levem a mal designer, muitas vezes vocês nos dão raiva mesmo, :D), e para mander compatibilidade ele cria outras tags, e la veio no minimo meio dia de serviço para ajustar esses campos ai para o nova classe (por ex: btext_field).

Mas vamos relembrar um conceito simples do Ruby as classes abertas. Nessa situação é um modulo (module), que gerencia os forms, o querido ActionView::Helpers::FormTagHelper.
Ele é o responsavel por renderizar esses objetos. agora basta simplesmente você alterar esse modulo, veja como fazer (editei no meu environment.rb, como ele não é recarregado tem que para o servidor e iniciar novamente, vocês podem fazer esse código em qualquer lugar)

module ActionView
module Helpers
module FormTagHelper
def text_field(object_name, method, options={})
super object_name, method, options.merge(:class => :btext_field)
end
def text_area(object_name, method, options={})
super object_name, method, options.merge(:class => :btext_area)
end
def check_box(object_name, method, options={}, checked_value="1", unchecked_value = "0")
super object_name, method, options.merge(:class => :bcheck_box), checked_value, unchecked_value
end
end
end
end

Caso não conheça o metodo merge dos hash do ruby, seria interessante conhece-lo, dessa maneira, não existe mais a necessidade de definir o atributo :class em cada text_field, essa alteração coloca automáticamente essa informação disponivel. Existem coisa que o ruby faz que surpreendem :D.

 
Design by ThemeShift | Bloggerized by Lasantha - Free Blogger Templates | Best Web Hosting