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

  1. - form_for(@foodo |f|  
  2.   %p= f.error_messages  
  3.   %table  
  4.     %tr  
  5.       %td= f.label 'Nome:'  
  6.       %td= f.text_field :name:class => :atext_field  
  7.     %tr  
  8.       %td= f.label 'Descrição:'  
  9.       %td= f.text_area :description:class => :atext_area  
  10.     %tr  
  11.        %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)
  1. module ActionView  
  2.   module Helpers  
  3.     module FormTagHelper  
  4.       def text_field(object_name, method, options={})  
  5.         super object_name, method, options.merge(:class => :btext_field)  
  6.       end  
  7.       def text_area(object_name, method, options={})  
  8.         super object_name, method, options.merge(:class => :btext_area)  
  9.       end  
  10.       def check_box(object_name, method, options={}, checked_value="1", unchecked_value = "0")  
  11.         super object_name, method, options.merge(:class => :bcheck_box), checked_value, unchecked_value  
  12.       end  
  13.     end  
  14.   end  
  15. 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