Tentativa de atualização de um projeto para Rails 4 (o qual ainda não está pronto)

Tentativa de atualização de um projeto para Rails 4 (o qual ainda não está pronto)

O Rails 4 ainda não foi lançado, tampouco tem uma versão beta, um Release Candidate ou algo do tipo.

Mas depois de ver os slides “What to expect in Rails 4.0” do Boston Ruby Group, fiquei com vontade de atualizar um projeto no qual estou trabalhando atualmente só pra ver se algo iria explodir :-)

Antes de mais nada

Dê uma olhada nos Release Notes e nesta árvore do Rails 4.

Atualização do Bundler

Bom, a primeira coisa que tive que fazer, foi atualizar o meu bundler (eu usava a versão 1.1.5 e atualizei para a 1.2.1), já que o Rails 4 precisa da versão 1.2.x ou superior.

Atualização do Gemfile

Feito isso, alterei algumas coisas no Gemfile, sendo que a parte relevante é essa abaixo:

# gem 'rails', '3.2.8'
gem 'rails', github: 'rails/rails' # Aqui vamos pegar o código mais novo do Rails, diretamente do Github :-)
gem 'journey', github: 'rails/journey' # o Rails depende da versão mais nova dessa gem
gem 'activerecord-deprecated_finders', github: 'rails/activerecord-deprecated_finders' # o Rails depende dessa gem, a qual ainda não foi lançada

group :assets do
  gem 'sass-rails', github: 'rails/sass-rails' # o Rails depende da versão mais nova dessa gem
  gem 'coffee-rails', github: 'rails/coffee-rails' # o Rails depende da versão mais nova dessa gem
  gem 'uglifier', '>= 1.0.3'
end

# resto do Gemfile...

Nesse ponto, a brincadeira meio que acabou pra mim: o Mongoid ainda não é compatível com o Rails 4. Mas resolvi seguir em frente, testando apenas as páginas estáticas (que não dependendiam do Mongo), só pra ver o que iria rolar…

Alterações no config/application.rb

Como nesse projeto, eu não fazia um

require 'rails/all'

pois não uso nem ActiveRecord nem test_unit, eu fazia require apenas do que eu precisava:

# require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

Mas eu tive que retirar o “active_resource/railtie” (que agora é uma gem externa) e o “sprockets/railtie” (este simplesmente não funcionou – e eu não pesquisei o motivo).

Rotas

Se você tiver alguma rota desse tipo:

match 'foobar' => 'foo#bar', via: 'put'

Você vai ver um erro assim: “You should not use the `match` method in your router without specifying an HTTP method. (RuntimeError)”.

A solução é usar o verbo HTTP no lugar do “match”:

put 'foobar' => 'foo#bar'

Isso também vale para rodas com o GET. Resumindo: não use mais o “match”! :-)

Aproveitando que estou falando de rotas, uma coisa muito interessante que eu descobri foi o novo stack trace de erro de rota, que agora mostra todas as rotas disponíveis (obviamente, só exibe isso no ambiente development). Segue um screenshot:

Configurações de ambientes

Uma nova configuração obrigatória nos arquivos config/environments/*.rb é o eager_load. Caso você não configure isso, receberá um WARNING:

config.eager_load is set to nil. Please update your config/environments/*.rb files accordingly:
  * development - set it to false
  * test - set it to false (unless you use a tool that preloads your test environment)
  * production - set it to true

Outro detalhe é que a config whiny_nils não existe mais, então eu precisei retirá-la.

Views e helpers

Em um trecho do meu HTML, eu usava o helper asset_path:

<%= asset_path 'some_image.png' %>

Mas rolava esse erro:

undefined method `asset_path' for #<#<Class:0x007...>

E resolvi isso por hora removendo essa linha (afinal, eu queria ver até onde eu conseguiria chegar).

Outro problema que tive em views foi esse:

undefined method `handle_positional_args' for #<#<Class:0x007...>

A primeira vez aconteceu em um helper link_to e depois em um form_for. Aparentemente, nenhum deles tinha nada demais. Novamente eu removi esses dois heleprs da minha view.

Então eu finalmente consegui ver a página (estática)! :-)

TL; DR => Conclusão

Consegui carregar apenas as páginas estáticas, uma vez que o Mongoid ainda não suporta o Rails 4.0. E pelo mesmo motivo, não consegui rodar nenhum teste :-(
Ainda é cedo pra começar a migrar os projetos (como eu já falei, o Rails 4 não tem nem mesmo um Release Candidate). O faça apenas para se divertir e/ou ajudar os desenvolvedores reportando bugs ou colaborando com o código!

  • Igor

    Olá, fez a atualização definitiva?
    Pode postar suas considerações?
    Parabens pelo post =)

Comments are closed.