« HE:labs
HE:labs

Modularizando sua aplicação usando Engines

Postado por Pedro Nascimento em 12/12/2012

Este é o primeiro post da série Engines aqui no blog da HE:labs.

Durante a última semana criamos três engines para agilizar nossos processos no StartupDev: omniauth-facebook-rails, sigame e favorite_it. Todas elas partiram de códigos utilizados várias vezes em outros projetos. Como qualquer outro projeto open source, qualquer colaboração é bem vinda e incentivada.

O que são Engines?

Engines são aplicações Rails que podem ser incluídas dentro da sua aplicação. Um exemplo clássico é o Devise. Ele adiciona entre outras coisas, controllers, views e vários helpers, além de disponibilizar alguns generators.

Quando criar Engines?

Engines servem para diminuir a duplicação de código em suas aplicações e/ou permitir um bootstrap mais eficiente de novas aplicações. Casos comuns:

  • Aplicações dentro da empresa que usam um layout e estrutura semelhantes.
  • Coisas que são feitas em grande parte das aplicações novas e que se perde algum tempo copiando código de uma aplicação pra outra.

Sem engines, se existe algum bug nessa funcionalidade duplicada, ou uma alteração no layout compartilhado, todas as aplicações tem que ser conferidas e consertadas. Isso demanda tempo desnecessário e caso você esqueça alguma aplicação, pode ser difícil verificar em que situação ela se encontra depois de um certo tempo.

Como criar engines?

Essa é a parte mais fácil! Apesar de existir algumas formas diferentes de fazê-lo, eu prefiro criar sempre uma "full engine", usando o comando:

1 rails plugin new nome_da_engine --full

Isso permite a você criar uma classe disponível em todas as suas aplicações. Por exemplo:

 1 #Na sua engine, em app/models/tweet_new_user.rb
 2 class TweetNewUser
 3   def initialize(user)
 4    @user = user
 5   end
 6 
 7   def tweet!
 8    Twitter.update("Novo usuário criado! #{@user.username}")
 9   end
10 end
1 #Na sua app, em app/model/user.rb
2 after_create :tweet_about_me
3 def tweet_about_me
4   TweetNewUser.new(self).tweet!
5 end

It just works™. Tudo que você criar dentro da Engine fica disponível na sua aplicação.

No próximo post da série discutiremos sobre alguns problemas que você encontra ao desenvolver usando Engines, e como resolvê-los.

Tem alguma tip sobre Engines? Fala aí nos comentários!

Tags: rails lunks

Compartilhe

Sabia que nosso blog agora está no Medium? Confira Aqui!