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!