ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

Rails4.0のアプリをRails4.1に移行したときのメモ

先日、めでたくRails4.1がリリースされ、
新しい機能が追加されました(`・ω・´)

Ruby on Rails 4.1 Release Notes — Ruby on Rails Guides

いくつかの機能は自前で実装していたので、
公式に実装されたのは実にありがたいことです

そこで、早速私も手持ちの「Gagnrath」を4.1に対応させることに(`・ω・´)

メジャーバージョンアップではないので、
app/ 以下のアプリ本体には影響がないと思われる一方、
新機能向けにconfigが修正されていることは予測できました

そこで、Gemfileで4.1を指定してUpgradeするのではなく、
rails new”して新しいプロジェクトを作り、
差分を見ながら移行してみることに...φ(・ω・`)

実際にどう変わったかというのは、
以下のcommitを見てもらえばいいのですが、
大雑把に気づいた点だけメモしておきます

https://github.com/parrot-studio/gagnrath/commit/5b035a012cfa6c1092037b73c680cbcaa7e08de3

アプリケーションモジュール名の取り扱いが変更

config周りを呼び出す際、以前は「[アプリ名]::Application」を使っていました
これが「Rails.application」に統一されています

# 以前の形式
Gagnrath::Application.configure do
  # config.hoge = piyo
end

# 新しい形式
Rails.application.configure do
  # config.hoge = piyo
end

結果的に、アプリ名は「config/application.rb」だけになっています
(元々あったものです)

module Gagnrath
  class Application < Rails::Application
    # ...
  end
end

変更理由はわかりませんが、個人的には4.1の形式が好みです(`・ω・´)

secrets.yml の追加

元々、「config/initializers/secret_token.rb」にtokenの値が書かれていたのですが、
ソースを公開したり、開発環境と本番でtokenを分けたりするのに都合が悪かったので、
自前の設定ファイルに環境ごとのtokenを書けるようにしていました

それが公式に「secrets.yml」という形で追加されたため、そちらに移行しました

本番だとデフォルトでは環境変数から読み込む仕組みになっていますが、
おそらくheroku等を意識した記述だと思います
実際の運用では直に書いてしまっています(´-ω-)

database.yml の修正

共通設定をdefaultに切り出し、
各環境では差分だけ書く形式になっています
(書き方だけの変更で、YAMLに元々ある仕様を利用しています)

仕事のシステムでもこういう書き方をしていたのですが、
こっちの方が合理的ですよね(`・ω・´)

あと、PASSを環境変数から読み込むのがデフォルトになってますが、
おそらく(ry

migrationでschema.rbを更新しない設定が追加(動作未確認)

これは4.1からなのかわかりませんが、
今回の移行で初めて気づきました

# config/environments/production.rb
Rails.application.configure do

  # Do not dump schema after migrations.
  config.active_record.dump_schema_after_migration = false  

end

仕事のシステムでリリース時にmigrationすると、
schema.rbが書き換わって次のリリース時に引っかかる*1のが面倒だったのですが、
この設定があれば避けられそうですね(`・ω・´)

*1: schema.rbもgitの管理下にある場合、書き換わると次のmergeで引っかかるんですよね・・・(´-ω-)