Rails4へのアップデート

現在仕事で作っているRailsアプリの一つをRails3.2.13から4.0.0にアップデートしたのでメモ。

パッケージのアップデート
Gemfile

coffee-railsは使っていないので書いてませんが、使ってる場合は4.0.0にする必要があるみたいです。
protected_attributesはStrong Parametersを使う前に他の部分のテストを実行する為に入れてます。
他のgemは変更してません。

gem "rails", "4.0.0"
gem "sass-rails",   "~> 4.0.0"
gem "uglifier", ">= 1.3.0"
gem "protected_attributes" # => 一時的に追加
config/application.rb

rails4からactive_resourceは標準では無くなったのでコメントアウトしておきます。

# Pick the frameworks you want:
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
# require "active_resource/railtie" # => コメントアウト
require "sprockets/railtie"
# require "rails/test_unit/railtie"
アップデート
bundle update
bundle exec rake rails:update

以下のファイルが更新/新規追加されます。
基本的には上書きして設定をマージしました。

  • config/boot.rb
  • config/routes.rb
  • config/application.rb
  • config/environment.rb
  • config/environments/development.rb
  • config/environments/production.rb
  • config/environments/test.rb
  • config/initializers/filter_parameter_logging.rb (新規)
  • config/initializers/inflections.rb
  • config/initializers/secret_token.rb
  • config/initializers/session_store.rb
  • config/initializers/wrap_parameters.rb
  • config/locales/en.yml
  • bin/bundle (新規)
  • bin/rails (新規)
  • bin/rake (新規)
主に設定したところ

config/application.rb:

基本的にはautoload/time_zone/i18nあたりの設定をしました。
filter_parametersはconfig/initializers/filter_parameter_logging.rbに書くようになったみたいです。

config/initializers/filter_parameter_logging.rb:

Rails.application.config.filter_parameters += [:password, :password_confirmation]

config/environments/*.rb:

action_mailerの設定とかその他環境ごとの設定。

config/initializers/session_store.rb:

sessionはmemcacheに設定しているので再設定。

テスト

config/routes.rbでmatchを使っている場合は直しておく。
また、メソッド違い(GETとかPOSTとか)で同じURLに:asで同じ名前をつけている場合はそれも直しておく。
テストを実行して通らないところは直しておく。

bundle exec rake spec
bundle exec rake cucumber

テストが通ったらGemfileからgem "protected_attributes"を削除してbundleしておく。

Views

link_toconfirmがまだ残っていたみたいなのでdata: {confirm: "text"}に変更。

DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead.
Model
  • scopeをlambda記法に修正
  • attr_accessibleを削除
Controller
  • Strong Parametersとspecの修正/追加
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    @user.save
  end

  def update
    @user = User.find(params[:id])
    @user.update_attributes(user_params)
  end

  private
  def user_params
    params.require(:user).permit(:name, :email)
  end
end
  • *_filter*_actionに変更

これは*_filterのままでも動作しますが、一応。

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_action :current_user
end
  • update_attributesupdateに変更

これも非推奨でもなく動作もしますが、一応。

class UsersController < ApplicationController
  def update
    @user = User.find(params[:id])
    @user.update(user_params)
  end

  private
  def user_params
    params.require(:user).permit(:name, :email)
  end
end
テスト
bundle exec rake spec
bundle exec rake cucumber
参考

http://www.engineyard.co.jp/blog/2013/rails-4-changes/ http://www.engineyard.co.jp/blog/2013/new-in-rails-4/ http://akasata.com/articles/303