Atualizando uma app Ruby on Rails antiga
Tags: ruby, rails, braziliandevs
Published: 2022-12-17 10:37:20

---
title: Atualizando uma app Ruby on Rails antiga
published: true
description: O que aprendi atualizando uma app Ruby on Rails antiga
tags: #ruby #rails #braziliandevs
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2z3t5e92qg7utukmz1fo.png
# Use a ratio of 100:42 for best results.
---

Depois da última aula do Curso OOP + Solid em Ruby, nosso professor ([@serradura](https://github.com/serradura)) nos disse para aplicarmos o conhecimento aprendido no curso numa app criada pelo mesmo chamada [rails_app_to_refactor](https://github.com/serradura/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:
```ruby
  message.gsub(/\s*Did\ you\ mean\?\ (.|\s)*/, "")
```

Após isso os testes voltaram a passar e em seguida adicionei o:
```ruby
  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:
```ruby
post todos_url, {
  headers: { 'Authorization' => "Bearer token=\"#{user.token}\"" },
  params: { todo: { title: '' } }
}
```
Depois:
```ruby
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:
```ruby
  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](https://github.com/serradura/rails_app_to_refactor/pull/1)

## 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](https://www.fastruby.io/blog/rails/upgrades/upgrade-rails-from-6-0-to-6-1.html)
- [Rubular](https://rubular.com)
- [Upgrade Rails From 6.1 to 7.0](https://www.fastruby.io/blog/rails/upgrades/upgrade-rails-6-1-to-7-0.html)
- [Upgrade Ruby From 2.7 to 3.0](https://www.fastruby.io/blog/ruby/upgrades/upgrade-ruby-from-2.7-to-3.0.html)
- [Ruby on Rails Tutorial Chapter 7 Integration Test Argument Error](https://stackoverflow.com/questions/66762685/ruby-on-rails-tutorial-chapter-7-integration-test-argument-error)
- [How to upgrade your Rails app to Ruby 3.1 with Rbenv](https://dev.to/thomasvanholder/how-to-upgrade-your-rails-app-to-ruby-31-with-rbenv-5efl)

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