<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Lucas</title>
    <description>The latest articles on Forem by Lucas (@brandaoplaster).</description>
    <link>https://forem.com/brandaoplaster</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F870211%2F381640cc-5958-4a9b-aaaa-63cb4a268bb2.jpeg</url>
      <title>Forem: Lucas</title>
      <link>https://forem.com/brandaoplaster</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/brandaoplaster"/>
    <language>en</language>
    <item>
      <title>Do Caos à Clareza Reduzindo Dependências em Rails</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Sat, 20 Dec 2025 16:51:00 +0000</pubDate>
      <link>https://forem.com/brandaoplaster/do-caos-a-clareza-reduzindo-dependencias-em-rails-9hl</link>
      <guid>https://forem.com/brandaoplaster/do-caos-a-clareza-reduzindo-dependencias-em-rails-9hl</guid>
      <description>&lt;p&gt;Após 21 anos de Ruby on Rails, hoje temos um ecossistema muito rico com milhares de soluções empacotadas em gems. Com essas milhares de opções disponíveis, às vezes somos tentados a adicionar gems para resolver tudo, o que vejo como um erro que cometemos.&lt;/p&gt;

&lt;p&gt;Por que sair instalando centenas de gems no seu projeto, sem realmente precisar, se torna uma das piores coisas? Cada gem adicionada cria dependência, um potencial de vulnerabilidade com o tempo, além de deixar a sua aplicação lenta e de difícil manutenção a longo prazo.&lt;/p&gt;

&lt;p&gt;O que quero explorar aqui é a filosofia do "menos é mais". Como assim? Instalar gems que são verdadeiramente essenciais, aquelas que pagam o "aluguel" por estarem no seu Gemfile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como Posso Fazer Isso?
&lt;/h2&gt;

&lt;p&gt;Pode estar se perguntando. Faça algumas perguntas, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Realmente preciso disso?&lt;/strong&gt; O Rails já não resolve esse problema?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Esta gem está ativa?&lt;/strong&gt; Qual foi a última atualização dessa gem? Está recebendo alguma atualização?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dá para resolver esse problema com código simples?&lt;/strong&gt; O que é uma classe com 30 linhas? Às vezes é melhor 30 linhas do que uma gem desconhecida e sem testes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O benefício supera o custo?&lt;/strong&gt; Complexidade, dependência e manutenção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;São algumas perguntas que se deve levar em conta antes de sair fazendo &lt;code&gt;bundle add hello_world&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As gems a seguir são gems que já usei por bastante tempo e, no meu ponto de vista, estão consolidadas. Porém, não é uma verdade absoluta, pois podemos ter opções de gems e nada impede de usar uma outra opção desta lista.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. RuboCop
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Gemfile&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'rubocop'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'rubocop-rails'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'rubocop-rspec'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;strong&gt;RuboCop&lt;/strong&gt; é considerado um &lt;strong&gt;pilar de padronização de código Ruby&lt;/strong&gt;, pois garante que o código siga um mesmo padrão entre diversos desenvolvedores, criando uma base de código consistente e legível.&lt;/p&gt;

&lt;p&gt;Verifica se o código possui más práticas, inconsistências e violações do estilo. É altamente configurável via arquivo &lt;code&gt;.rubocop.yml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impacto na equipe:&lt;/strong&gt; elimina discussões sobre estilo de código, fazendo com que code review foque em lógica e bom código, e não na formatação de código. Além de facilitar para novos desenvolvedores que entrem no time.&lt;/p&gt;

&lt;p&gt;Configuração básica do &lt;code&gt;.rubocop.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;inherit_from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.rubocop_todo.yml&lt;/span&gt;

&lt;span class="na"&gt;AllCops&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;TargetRubyVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3.1&lt;/span&gt;
  &lt;span class="na"&gt;NewCops&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;enable&lt;/span&gt;

&lt;span class="na"&gt;Style/Documentation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="na"&gt;Metrics/LineLength&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Max&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. RSpec
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RSpec&lt;/strong&gt; é o framework de &lt;strong&gt;testes para Ruby&lt;/strong&gt; mais popular no mundo Rails. Uma ótima sintaxe e possui recursos poderosos para testar classes e métodos. Esta gem possui outras gems que ajudam a complementá-la:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FactoryBot&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faker&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SimpleCov&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada gem destas possui um papel importante que complementa o RSpec. Vou fazer um breve resumo de cada uma.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1. FactoryBot
&lt;/h3&gt;

&lt;p&gt;A gem FactoryBot é usada para criar dados de teste de forma consistente e flexível. Podemos definir uma factory, por exemplo, para o modelo User.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Observação: já estou usando a próxima gem, a Faker.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# spec/factories/users.rb&lt;/span&gt;
&lt;span class="no"&gt;FactoryBot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nb"&gt;name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Internet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PhoneNumber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;phone_number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;full_address&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;trait&lt;/span&gt; &lt;span class="ss"&gt;:admin&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;role&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;trait&lt;/span&gt; &lt;span class="ss"&gt;:with_posts&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:create&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;create_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;user: &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Uso nos testes:&lt;/span&gt;
&lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user_with_posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:with_posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;strong&gt;FactoryBot&lt;/strong&gt; serve para &lt;strong&gt;simplificar e padronizar a criação de dados de teste&lt;/strong&gt;. Ganho de flexibilidade, legibilidade e consistência nos testes.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2. Faker
&lt;/h3&gt;

&lt;p&gt;Esta gem é muito útil para gerar dados falsos e aleatórios, tanto para testes como para seeds em ambiente de QA. Funciona muito bem em conjunto com &lt;strong&gt;FactoryBot&lt;/strong&gt;. Cria dados faker para ambiente de QA e testes, evitando o uso de dados reais e sensíveis nesses ambientes, não dando brechas de segurança.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3. SimpleCov
&lt;/h3&gt;

&lt;p&gt;SimpleCov é uma gem útil para analisar a cobertura dos testes da sua aplicação Ruby on Rails. Mostra partes do código que possuem cobertura ou que faltam testes. O que ajuda a criar testes mais completos e aumenta a confiabilidade e facilita a manutenção de código.&lt;/p&gt;

&lt;p&gt;Todas as vezes que o RSpec for rodado, o SimpleCov gera relatório mostrando quais partes do código foram cobertas.&lt;/p&gt;

&lt;p&gt;Uma configuração básica do SimpleCov:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'simplecov'&lt;/span&gt;
&lt;span class="no"&gt;SimpleCov&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt; &lt;span class="s1"&gt;'rails'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;add_filter&lt;/span&gt; &lt;span class="s1"&gt;'/spec/'&lt;/span&gt;
  &lt;span class="n"&gt;add_filter&lt;/span&gt; &lt;span class="s1"&gt;'/config/'&lt;/span&gt;
  &lt;span class="n"&gt;add_filter&lt;/span&gt; &lt;span class="s1"&gt;'/vendor/'&lt;/span&gt;

  &lt;span class="n"&gt;minimum_coverage&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;
  &lt;span class="n"&gt;refuse_coverage_drop&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Bullet
&lt;/h2&gt;

&lt;p&gt;Usada no ambiente de desenvolvimento, ajuda a identificar &lt;strong&gt;problemas de performance relacionados a consultas de banco de dados&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Detecta consultas desnecessárias com N+1 queries ou associações carregadas mas não usadas. Ajuda o desenvolvedor a identificar esses problemas no ambiente de desenvolvimento, impedindo assim que chegue ao ambiente de produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Brakeman
&lt;/h2&gt;

&lt;p&gt;Essa gem acho interessante, pois é um analisador de segurança estático que analisa aplicações em busca de vulnerabilidades, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQL Injection&lt;/strong&gt;: permite que usuários maliciosos alterem consultas ao banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Site Scripting (XSS)&lt;/strong&gt;: executa scripts maliciosos no navegador de outros usuários.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Injection&lt;/strong&gt;: possibilita executar comandos no servidor via entrada do usuário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unsafe redirects&lt;/strong&gt;: redirecionamentos sem validação que podem levar a sites maliciosos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insecure Session Handling&lt;/strong&gt;: sessões e cookies mal protegidos que podem ser roubados ou manipulados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando estamos escrevendo código, muitas vezes não damos a devida importância para a segurança, então vejo essa gem como uma boa ferramenta para auxílio.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Pry
&lt;/h2&gt;

&lt;p&gt;Ferramenta de depuração interativa para Ruby que substitui o console padrão. Permite pausar a execução do código em qualquer ponto usando &lt;code&gt;binding.pry&lt;/code&gt;, ganhando o poder de inspecionar variáveis, executar código em tempo real e navegar pelo stack trace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opções Bônus
&lt;/h2&gt;

&lt;p&gt;Vou citar algumas opções bônus que são interessantes:&lt;/p&gt;

&lt;p&gt;Dentro do contexto de depuração, existem duas gems: &lt;strong&gt;Better Errors &amp;amp; Binding of Caller&lt;/strong&gt;. Substituem a página de erro default do Rails por uma &lt;strong&gt;interface interativa e detalhada&lt;/strong&gt;, permitindo visualizar a stack trace, inspecionar variáveis e explorar os contextos de chamadas anteriores diretamente no navegador. Ferramenta bem útil para ajudar na depuração, tornando o processo mais rápido. Mas essas duas gems deixo apenas como um bônus.&lt;/p&gt;

&lt;p&gt;Para processamento assíncrono de tarefas em background, o &lt;strong&gt;Sidekiq&lt;/strong&gt; é uma ótima escolha. Permite que você execute tarefas demoradas, como envio de emails, processamento de arquivos ou requisições externas, &lt;strong&gt;fora do fluxo principal da aplicação&lt;/strong&gt;, sendo altamente eficiente e escalável.&lt;/p&gt;

&lt;p&gt;Para todos os projetos que necessitam de autenticação, nem precisamos pensar muito: &lt;strong&gt;Devise&lt;/strong&gt; é a melhor escolha, já fornece uma solução completa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O Rails já resolve muita coisa, então antes de adicionar qualquer gem, pergunte-se: o Rails já não resolve esse problema? Na maioria das vezes, a resposta é sim.&lt;/p&gt;

&lt;p&gt;Não se trata de reinventar a roda, mas de avaliar se a adição de uma gem é realmente justificável. Um Gemfile enxuto deixa a aplicação mais rápida, com menos dependências, atualizações mais fáceis e menos riscos de problemas de segurança.&lt;/p&gt;

&lt;p&gt;Comece pelo simples, mantenha o simples sempre que possível e adicione novas gems apenas quando a necessidade for real e recorrente.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>maintainability</category>
    </item>
  </channel>
</rss>
