Atualizando uma app Ruby on Rails antiga
Vinícius Bispo
Posted on December 17, 2022
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)*/, "")
Após isso os testes voltaram a passar e em seguida adicionei o:
config.load_defaults 6.1
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: '' } }
}
Depois:
post todos_url,
headers: { 'Authorization' => "Bearer token=\"#{user.token}\"" },
params: { todo: { title: '' } }
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
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.
- Upgrade Rails From 6.0 to 6.1
- Rubular
- Upgrade Rails From 6.1 to 7.0
- Upgrade Ruby From 2.7 to 3.0
- Ruby on Rails Tutorial Chapter 7 Integration Test Argument Error
- How to upgrade your Rails app to Ruby 3.1 with Rbenv
É isso pessoal, espero que vocês gostem deste artigo, até a próxima e tchau.
Posted on December 17, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.