« HE:labs
HE:labs

Por que usar Concerns?

Postado por Pedro Henrique em 24/10/2014

Com a chegada do rails 4, tivemos o incremento de diversas features no framework, e em uma dessas features, temos os Concerns, que podem ajudar a deixar seu código mais limpo.

Provavelmente você já deve ter tido ou tem em sua aplicação, um monte de código se repetindo nos seus models e controllers e se perguntou o que poderia fazer pra deixar esse código menos repetitivo, e é aí que entram os concerns.

Como podemos observar, os dois models possuem código repetido, e que por sua vez, apresentam o mesmo comportamento:

 1 #app/models/post.rb
 2 class Post < ActiveRecord::Base
 3   def permalink
 4     [self.title, id].join('-')
 5   end
 6 
 7   def seo_title
 8     self.title
 9   end
10 
11   def seo_category
12     self.category
13   end
14 
15   def seo_description
16     self.description
17   end
18 end
 1 #app/models/event.rb
 2 class Event < ActiveRecord::Base
 3   def permalink
 4     [self.title, id].join('-')
 5   end
 6 
 7   def seo_title
 8     self.title
 9   end
10 
11   def seo_category
12     self.category
13   end
14 
15   def seo_description
16     self.description
17   end
18 end

Em uma situação em que temos diversos models como esses e seja necessária uma modificação, teriamos bastante trabalho, e além do mais demandaria muito tempo.

Escrevendo tudo isso em um concern, precisariamos escrever apenas um arquivo com o mesmo código, tendo somente que incluir uma linha nos nossos models.

 1 #app/models/concerns/seo.rb
 2 module Seo
 3   extend ActiveSupport::Concern
 4 
 5   def permalink
 6     [self.title, id].join('-')
 7   end
 8 
 9   def seo_title
10     self.title
11   end
12 
13   def seo_category
14     self.category
15   end
16 
17   def seo_description
18     self.description
19   end
20 end
1 #app/models/post.rb
2 class Post < ActiveRecord::Base
3   include Seo
4 end
1 #app/models/event.rb
2 class Event < ActiveRecord::Base
3   include Seo
4 end

Dessa forma, deixamos nossos models bem mais limpos, pois compartilhamos as responsabilidades que são comuns entre eles. Se quiser dar uma olhada no source, encontra-se no meu github. Exemplo Concerns

Se quiser saber um pouco mais sobre Concerns, recomendo dar uma lida na documentação

Tags: rails concerns

Compartilhe

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