Atualizando uma app Ruby on Rails antiga

vinibispo

Vinícius Bispo

Posted on December 17, 2022

Atualizando uma app Ruby on Rails antiga

Depois da última aula do Curso OOP + Solid em Ruby, nosso professor (@serradura) nos disse para aplicarmos o conhecimento aprendido no curso numa app criada pelo mesmo chamada rails_app_to_refactor, uma app feita para serem feitas experimentações nela.

Qual o problema que precisamos resolver?

A app está com as versões do Ruby e do Rails defasadas e para usar tudo que aprendemos no curso precisamos que a versão do ruby seja a 3.1.2

Como resolver?

Poderíamos resolver de dois jeitos:

  • Reescrever a app num ruby maior
  • Atualizar a app para um ruby maior

Para mim eu achei um desperdício reescrever toda a app, sendo que todos os testes já foram criados, todos os casos de uso, etc.
Logo (pelo título também dá para saber) eu escolhi a opção de atualizar.

Como foi o processo de atualização do Rails?

Em primeiro lugar eu removi o Gemfile.lock e rodei um bundle install porque estava dando erro no mimemagic.

Depois disso eu segui o que dizia no fastruby.io e atualizei pro rails 6.1. Resolvi não seguir o dual boot por ser uma app simples, mas se fosse uma app do mundo real eu teria feito para não prejudicar os clientes da minha app.

Após isso os testes não estavam passando por conta de que a gem DidYouMean se integrou no Rails, aí a mensagem foi alterada para: (exemplo) {"error": "Invalid parameter. Did you mean something?"}

Com esse erro aprendi o que uma indireção pode custar para um projeto (demorei muito para encontrar a raiz).

Para solucionar precisei no arquivo app/controllers/application_controller.rb mudar para o seguinte:

  message.gsub(/\s*Did\ you\ mean\?\ (.|\s)*/, "")
Enter fullscreen mode Exit fullscreen mode

Após isso os testes voltaram a passar e em seguida adicionei o:

  config.load_defaults 6.1
Enter fullscreen mode Exit fullscreen mode

para funcionar sem problemas, rodei os testes novamente, e bora para a próxima fase.

Nisso eu atualizei para o Rails 7 alterando no Gemfile a versão do rails, rodando bundle install e rodando a rake rails app:update como foi me ensinado no fastruby.

Após comparar vários diffs, verificar o que o Rails quer substituir e ver se faz sentido, cheguei ao Rails 7

Até aqui os testes estavam passando, então parti para a atualização do ruby.

Como foi o processo da atualização do Ruby?

Na atualização do Ruby meu objetivo era chegar no 3.1.2, mas primeiro tive que passar pelo 3.0.0

Primeiro tive que baixar a versão 3.0.0 no meu gerenciador de versões de Ruby, depois alterei o Gemfile para o Ruby 3.0.0 e alterei o arquivo .ruby-version para ruby-3.0.0.

Após isso, rodei gem install bundler:2.2.32 porque o Ruby 3.0.0 não tinha o bundler que eu estava. Logo depois rodei bundle.

Após verificar os testes, percebi que alguns pararam de passar.

O Error era o famoso ArgumentError nos métodos http, e estava acontecendo porque antes o ruby transformava um hash em kwargs(keyword arguments), mas no ruby 3.0.0 ele não convertia, por isso minha solução foi remover os {} blocos nas partes dos testes. Para exemplificar mostrarei o antes e o depois.

Antes:

post todos_url, {
  headers: { 'Authorization' => "Bearer token=\"#{user.token}\"" },
  params: { todo: { title: '' } }
}
Enter fullscreen mode Exit fullscreen mode

Depois:

post todos_url,
  headers: { 'Authorization' => "Bearer token=\"#{user.token}\"" },
  params: { todo: { title: '' } }
Enter fullscreen mode Exit fullscreen mode

Assim todos os testes voltaram a passar.

Para atualizar pro ruby 3.1.2 eu tive que fazer os primeiros 3 parágrafos desse tópico a diferença é que agora era 3.1.2.
O bundle não funcionou por conta de uma dependência chamada sexp_processor que a versão que estava não funcionava na versão 3.1.2.
Eu resolvi isso rodando um bundle update rodei os testes e tudo voltou a passar.

Disclaimer: quando disse que rodei os testes cada uma das vezes significa que eu rodei o rails t e fiz os curls disponíveis no README.md

Voltando ao Rails

Eu estava com uma dúvida na minha cabeça se o DidYouMean ainda estava integrado ao Rails e descobri que não. Nisso eu removi aquela regex maluca e continuou a funcionar.

O Pull Request

Ao fazer o PR, percebi que eu havia removido sem querer em uma das versões a seguinte config:

  config.action_mailer.delivery_method = :letter_opener
Enter fullscreen mode Exit fullscreen mode

Para consertar eu errei e deixei no config/application.rb. E funcionou, o problema foi que o lugar certo era no config/environments/development.rb, mas foi percebido pelo revisor do PR e consertado.

No momento que eu escrevo o PR já foi mergeado.

Você pode ver ele acessando aqui

Referências

Para chegar a todo esse resultado eu precisei de várias pesquisas e nada mais justo do que deixar elas para beneficiar quem precisa também.


É isso pessoal, espero que vocês gostem deste artigo, até a próxima e tchau.

💖 💪 🙅 🚩
vinibispo
Vinícius Bispo

Posted on December 17, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related