Rails 3.1 -> Rails 3.2 アップデートメモ: Rails update (2)

はじめに

Rails 3.1 へのアップデートはテスト修正でかなり大変でした。3.2 へのアップデートはもう少し何とかなるかなと思っています。また、記録を残していきます。

rails 3.2.22.5 gem への変更

まず、Gemfile の Rails のバージョンを変更します。

gem 'rails', '3.2.22.5'

次に bundle update します。

bundle update rails actionpack activesupport rack-cache sass-rails railties rake rails-erd haml-rails activerecord haml coffee-rails

3.1 の時と同様に vimdiff で rails:update を実施します。

env THOR_DIFF=vimdiff rake rails:update

次のコマンドでサーバを動かしてみます。3000 番ポートにアクセスするといつもの画面が表示されました。

be rails server

Ruby のバージョンアップ

Rails 3.1 までは Ruby 1.9.3 が上限でしたが、Rails 3.2 は 2.3.3 まで Ok になります。ただ、この後、4.0 にあげることを考えると、2.2 までに止めておいた方がよさそうです。

まず、Ruby を 2.2 にあげます。これだけでもずいぶん助かります。

rbenv install 2.2.0

エラー対応

Rails 3.2 では、attr_accessible のチェックが厳しくなりました。model における保存でも、ここに書かれていない属性は保持できなくなりました。これまでは、コントローラで変更される属性にのみ、記述されていたものが多かったため、全ての属性を attr_accessible に記載しました。Rails 4.0 になると、今度は strong_parameters に変わるわけですが、とりあえず対応しておきます。ただ、この対応のおかげで、業者の人などが後から追加した属性などに気づくことができたのでよかったです。

また、controller_spec でもエラーになりました。create のテストなどでは、以下のように既存のオブジェクトの属性を取り出して、取り出した @attrs で作成テストをしていました。

  before { @attrs = object.attributes; object.destroy }

この状態のテストだと、object に存在する id, created_at, updated_at も @attrs に入ってしまうため、create のテストで失敗していました。これも strong_parameters が入ればいらなくなるのですが、今回は rails_helper に以下のメソッドを追加しました。

  def remove_common_params(ps)
    [:id, :created_at, :updated_at].each do |key|
      ps.delete key
      ps.delete key.to_s
    end
    ps
  end

このメソッドを object.attributes の前に書くことで、id, created_at, updated_at の属性を取り除きました。

  before { @attrs = remove_common_params object.attributes; object.destroy }

これ以外にもいくつかの修正をはどこした結果、テストは全て通過しました。

Finished in 11 minutes 14 seconds (files took 30.69 seconds to load)
7723 examples, 0 failures, 99 pending 

Coverage report generated for RSpec to /opt/webcitc/coverage. 24905 / 35854 LOC (69.46%) covered.

Ruby 1.9.3 の 3.1 の時が 24分19秒だったので、Ruby 2.2 の 3.2 は半分くらいの時間で終了していますね。早くこっちの世界に移りたいです。

Finished in 24 minutes 19 seconds (files took 1 minute 45.1 seconds to load)

gem の推移はこんな感じになりました。

gem_name ver3.1 ver3.2 changed
actionmailer 3.1.12 3.2.22.5
actionpack 3.1.12 3.2.22.5
activemodel 3.1.12 3.2.22.5
activerecord 3.1.12 3.2.22.5
activeresource 3.1.12 3.2.22.5
activesupport 3.1.12 3.2.22.5
arel 2.2.3 3.0.3
bcrypt 3.1.16 3.1.16 =
bcrypt-ruby 3.1.5 3.1.5 =
better_errors 1.1.0 2.9.1
binding_of_caller 0.8.0 0.8.0 =
brakeman 4.4.0 4.4.0 =
builder 3.0.4 3.0.4 =
choice 0.1.7 0.2.0
ci_reporter 2.0.0 2.0.0 =
coderay 1.1.3 1.1.3 =
coffee-rails 3.1.1 3.2.2
coffee-script 2.4.1 2.4.1 =
coffee-script-source 1.12.2 1.12.2 =
concurrent-ruby 1.1.7 1.1.7 =
database_cleaner 1.8.5 1.8.5 =
debug_inspector 0.0.3 0.0.3 =
devise 2.2.8 2.2.8 =
devise-encryptable 0.2.0 0.2.0 =
devise_ldap_authenticatable 0.7.0 0.7.0 =
diff-lcs 1.4.4 1.4.4 =
docile 1.3.2 1.3.4
dotenv 2.7.6 2.7.6 =
erubi 1.10.0 +
erubis 2.7.0 2.7.0 =
execjs 2.7.0 2.7.0 =
factory_bot 4.11.1 4.11.1 =
factory_bot_rails 4.11.1 4.11.1 =
ffi 1.10.0 1.12.2
formatador 0.2.5 0.2.5 =
guard 1.8.3 2.15.1
guard-compat 1.2.1 +
guard-rspec 1.2.2 4.7.3
haml 4.0.7 4.0.7 =
haml-rails 0.4 0.4 =
hike 1.2.3 1.2.3 =
hpricot 0.8.6 0.8.6 =
i18n 0.9.5 0.9.5 =
interception 0.5 0.5 =
journey 1.0.4 +
jquery-rails 3.1.5 3.1.5 =
json 1.8.6 1.8.6 =
kaminari 0.17.0 0.17.0 =
listen 1.3.1 3.0.8
lumberjack 1.0.12 1.0.13
mail 2.4.4 2.5.5
method_source 0.9.2 0.9.2 =
mime-types 1.25.1 1.25.1 =
mini_portile2 2.1.0 2.4.0
multi_json 1.15.0 1.15.0 =
nenv 0.3.0 +
net-ldap 0.3.1 0.3.1 =
nokogiri 1.6.8 1.9.1
notiffany 0.1.3 +
orm_adapter 0.5.0 0.5.0 =
pg 0.18.4 0.20.0
pkg-config 1.1.9 -
polyglot 0.3.5 0.3.5 =
power_assert 1.2.0 +
pry 0.12.2 0.12.2 =
pry-doc 0.10.0 1.1.0
pry-rails 0.3.9 0.3.9 =
pry-rescue 1.5.2 1.5.2 =
public_suffix 1.4.6 3.1.1
puma 3.11.4 3.12.6
rack 1.3.10 1.4.7
rack-cache 1.7.1 1.9.0
rack-mount 0.8.3 -
rack-ssl 1.3.4 1.3.4 =
rack-test 0.6.3 0.6.3 =
rails 3.1.12 3.2.22.5
rails-erd 1.1.0 1.5.2
railties 3.1.12 3.2.22.5
rake 12.2.1 13.0.3
rb-fsevent 0.10.4 0.10.4 =
rb-inotify 0.9.10 0.10.1
rb-kqueue 0.2.5 -
rb-readline 0.5.5 0.5.5 =
rdoc 3.12.2 3.12.2 =
redcarpet 3.5.0 3.5.1
rspec 3.9.0 +
rspec-core 3.9.3 3.9.3 =
rspec-expectations 3.9.4 3.9.4 =
rspec-mocks 3.9.1 3.9.1 =
rspec-rails 3.9.1 3.9.1 =
rspec-support 3.9.4 3.9.4 =
ruby-graphviz 1.0.9 1.2.4
sass 3.4.25 3.7.4
sass-listen 4.0.0 +
sass-rails 3.1.7 3.2.6
shellany 0.0.1 +
simplecov 0.17.1 0.17.1 =
simplecov-html 0.10.2 0.10.2 =
simplecov-rcov 0.2.3 0.2.3 =
sprockets 2.0.5 2.2.3
test-unit 3.3.7 +
thor 0.14.6 0.20.3
tilt 1.3.7 1.4.1
treetop 1.4.15 1.4.15 =
tzinfo 0.3.58 0.3.58 =
uglifier 4.2.0 4.2.0 =
uniform_notifier 1.11.0 1.11.0 =
warden 1.2.7 1.2.7 =
watchr 0.7 -
yard 0.9.25 0.9.25 =
yard-activerecord 0.0.16 0.0.16 =

とりあえず一段落したので、コミットしておきます。

hkob.hatenablog.com