Uma das coisas mais legais no Rails
é o suporte a Plugins …
O Ruby On Rails em si já é um excelente framework, mas a combinação dos Plugins do Rails com as classes abertas do Ruby é uma combinação explosiva!
Esta combinação é o que permite a criação de “tags” customizadas para utilizar nas suas aplicações RoR nas views e nos layouts.
E é realmente fácil de criar estes “view helpers” no Rails.
A forma padrão (sem plugins) de se criar estas “tags” é simplesmente criar um método em uma das classes Helper (as que ficam em app/helpers), por exemplo, se todos os forms na sua aplicação ficam dentro de tabelas, com uma coluna para o label e uma para o campo real, você pode criar um método helper para diminuir bastante a quantidade de código a ser digitada seguindo estes passos:
- rails plugins101
- cd plugins101
- ./script/generate scaffold example name:string url:string
O formulário padrão, bastante simples e feio, para o model “Example” que criamos, nesta aplicação seria algo parecido com:
1
2
3
4
5
6
7
| <% form_for(@example) do |f| %>
<table>
<tr><td><label for="example_name">Name</label></td><td><%= f.text_field :name %></td></tr>
<tr><td><label for="example_name">Url</label></td><td><%= f.text_field :url %></td></tr>
<tr><td colspan="2"><%= f.submit "Update" %></td></tr>
</table>
<% end %> |
mas se editarmos o arquivo app/helpers/application_helper.rb e adicionarmos o seguinte método:
1
2
3
| def textfield label, object, property, options = {}
%Q{<tr><td><label for="#{object.to_s}_#{property.to_s}">#{label}</label></td><td>#{text_field object, property, options}</td></tr>}
end |
o código da view ficaria muito mais simples como podemos ver abaixo.
1
2
3
4
5
6
7
| <% form_for(@example) do |f| %>
<table>
<%= textfield "Name", :example, :name %>
<%= textfield "Url", :example, :url %>
<tr><td colspan="2"><%= f.submit "Update" %></td></tr>
</table>
<% end %> |
Se você pensar apenas neste pequeno formulário, pode parecer muita complicação para pouca coisa, mas pensando na aplicação inteira isto poupa bastante trabalho
Agora pensando um pouco maior, imagine que este padrão de layout (bem feio por sinal) que eu defini para esta aplicação, seja o padrão de todas as aplicações de toda a empresa!
e todos os desenvolvedores estão trabalhando da primeira forma que eu descrevi, codificando o HTML direto em todas as páginas.
Um belo dia, um designer novo, contratado pelo dono da empresa, diz que em todos os TR de todos os forms, é necessário adicionar uma classe CSS.
Nesta situação, o negócio é sentar e chorar …
Mas se você escolheu trabalhar da segunda forma, utilizando um helper, no máximo você precisara alterar uma linha de código por aplicação!
Você pode se considerar um herói! Certo?
Mas considere a opção de você ser ainda mais esperto do que isto! Que tal criar um plugin que vai conter estas tags para facilitar o trabalho, e utilizar este plugin em todas as aplicações da empresa?
Desta forma você precisaria alterar apenas uma linha de código, testar apenas uma vez, e todas as aplicações da empresa ja estariam corrigidas!
E como sempre, com o Rails, esta é uma tarefa muito fácil de ser completada 
Apenas siga estes passos simples:
- ./script/generate plugin life_saver
- Edite o arquivo vendor/plugins/life_saver/lib/life_saver.rb e adicione o seguinte código nele:
1
2
3
4
5
6
| # LifeSaver
module LifeSaver
def textfield label, object, property, options = {}
%Q{<tr><td><label for=#{object.to_s}_#{property.to_s}>#{label}</label></td><td>#{text_field object, property, options}</td></tr>}
end
end |
- Edite o arquivo vendor/plugins/life_saver/init.rb e inclua o seguinte código:
1
2
| # Include hook code here
ActionView::Base.send :include, LifeSaver |
- Remova o método helper que adicionamos no arquivo app/helpers/application_helper.rb
Ok, você acabou de criar o seu primeiro plugin para o Rails
!
E sim, o código é exatamente o mesmo utilizado no application_helper.rb, o único truque esta no init.rb, aquela linha de código, inclui todos os métodos do module “LifeSaver” na classe base de todas as views do Rails, a ActionView::Base.
Agora, se você escolheu esta terceira opção, va falar com o seu chefe, conte uma historia parecida com a que eu contei aqui, e peça um aumento, por que você merece, você acabou de poupar diversas horas de trabalho de umas 3 pessoas pelo menos
Espero que este pequeno passo a passo ajude alguem
Este é o primeiro post de uma série sobre escrita de plugins para RoR, o próximo vai ser sobre testes unitários para o código dos seus plugins, o terceiro vai falar de plugins com generators, e o quarto vocês vão ter que voltar aqui para descobrir sobre o que vai ser 
Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!