asumi.chをRails3.2からRails4.2までアップグレードした

asumi.chを公開してもう1年以上たちましたね.


阿澄病治療薬を作った - PartyIX


そろそろ時期なのかなーということで,Railsのバージョンアップをしました.


というわけでメモを残しておきます.

とりあえずアップデートをかけてエラーを起こしてから対処

機能としてはすべて把握しているので,どこをチェックすればいいかはだいたいわかっています.
というわけで,とりあえずアップデートをかけてしまいましょう.


まずは,rubyのバージョンをあげます.

以前は1.9.3を使っていたのですが,これももうサポート対象外になってしまうので,2.2.0まで上げました.
rbenvを使っているので,このへんはいつもどおり…….

と思いきやエラーが出ます.

/usr/bin/ld: ./libffi-3.2.1/.libs/libffi.a(raw_api.o): relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC
./libffi-3.2.1/.libs/libffi.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

これはどうやらlibffi-devを入れれば問題ないらしい.

$ sudo apt-get install libffi-dev

そしてGemfileを修正します.

gem 'rails', '4.2.0'

gem 'sass-rails'
gem 'coffee-rails'

rails以外にも関連してバージョン指定してあったもののバージョン指定を外します.

$ bundle update
$ bundle exec rake rails:update

こうしてrailsのアップデートをかけると,config/以下のファイルが上書きされていきます.
対話形式で聞かれるので適当に答えていきましょう.
なんか残さなきゃいけない設定とかは,後から編集するなりとっておくなりしてください.

以下,修正が必要になった点

  • routes.rb内のmatchを排除
  • development.rb,production.rb内のegger_load設定

mass-assignmentの対応

Rails3.2時代にはattr_accessibleが多用されていました.

フォームなんかで,パラメータを渡すとそのままモデルのcreate,updateをしてくれるようなコードを書く際,アクセスを許可する属性を書いていたんですね.
これがRails4.0から廃止になりました.

attr_accessibleが記述されているモデルはすべてエラーになるので(attr_accessibleが定義されていない),すべて削除します.
代わりに,モデルにpostしているコントローラでstrong_parametersを使うように変更します.


Rails4.0に含まれる strong_parameters について - willnet.in


debuggerの変更

ruby1.9系ではdebuggerというgemが大変重宝していました.

cldwalker/debugger · GitHub


ただし,ruby2.0以降ではdebuggerは使えなくなっています.
そのため,新しいデバッガとしてpry-byebugを導入しました.

deivid-rodriguez/pry-byebug · GitHub


asset-pathの記述変更

scssでの画像指定の際などに,asset-pathを指定していたんですが,そこの記述方法が多少変更になっています.

Rails3.2

background: url(asset-path("blur_back04.jpg",image));

Rails4.2

background: image-url("blur_back04.jpg");

twitter gemの記述修正

関連するgemのアップデートもかかっているので,twitter gemが変更になっていたりします.

このへんは公式を見て記述をあわせます.

twitter 4.6.2

Twitter.configure do |config|
  config.consumer_key = Settings.twitter.consumer_key
  config.consumer_secret = Settings.twitter.consumer_secret
  config.oauth_token = Settings.twitter.oauth_token
  config.oauth_token_secret = Settings.twitter.oauth_token_secret
end

twitter 5.13.0

@client = Twitter::REST::Client.new do |config|
  config.consumer_key = Settings.twitter.consumer_key
  config.consumer_secret = Settings.twitter.consumer_secret
  config.access_token = Settings.twitter.oauth_token
  config.access_token_secret = Settings.twitter.oauth_token_secret
end

rails serverのデフォルトホスト変更

本番には一切影響しませんが,developmentで開発している際に,rails serverを起動すると,デフォルトホストが書き換わっています.


Ruby on Rails 4.2 リリースノート — Rails ガイド


今までは0.0.0.0:3000だったものが,localhost:3000に書き換わっています.
vagrantなどで実行している際に,ブラウザで192.168.33.10:3000とか打ってもアクセスできません.

$ rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-02-08 15:29:18] INFO  WEBrick 1.3.1
[2015-02-08 15:29:18] INFO  ruby 2.2.0 (2014-12-25) [x86_64-linux]
[2015-02-08 15:29:18] INFO  WEBrick::HTTPServer#start: pid=3546 port=3000

と起動してやることで,今まで通りにアクセスできます.

ページキャッシュ

Rails4.0からpage cache,action cacheは廃止になりました.
表示部分のキャッシュについては,fragment cache(Russian Doll Caching)を使います.

Rils4で Russian Doll Caching を楽しむためのまとめ [俺の備忘録]


オブジェクトのキャッシュについてはRails.cache.fetchで対応できます.

http://easyramble.com/rails-cache-fetch.html


page cacheやaction cacheを使いたい場合は,gemで別途入れます.
rails/actionpack-page_caching · GitHub
rails/actionpack-action_caching · GitHub




まとめ

画像を軽くしたりページキャッシュを真面目に導入したりしたので,かなり速くなりました.

阿澄ちゃん


それよりも感じるのは,railsの初期化が入るような場合は圧倒的に速くなった感じがあります.
springを使ってなくてもサクサク開発できてストレスがない.

このアプリケーションはcronに結構大量のrakeタスクを積んでいるので,そういう部分まで速くなっているのは嬉しいです.