Rails 4.2へのアップグレードを成功させる方法
Railsアプリの中には、bundle update railsコマンド一つでアップグレードできるものもあります。
しかし、そうはいかないタイプのアプリを持っている場合はどうでしょうか? 移行作業が億劫で、そのままRails 4.0や3.2のまま放置してしまったアプリのことです。
スムーズなアップグレードでも、苦労するアップグレードでも、この記事の手順に従えば、できるだけスムーズにRails 4.2へ移行できます。さらに、その過程でRails 4.2の新機能を最大限に活用する方法も学べます。
まずはアップグレードガイドを読む
Railsのアップグレード作業は、必ず公式の「Railsアップグレードガイド」を読むことから始めましょう。
アップグレードガイドには、バージョン間の主要な変更点のほとんどが解説されています。アプリで遭遇する大きな問題を解決するために、コードをどう変更すべきかが具体的に書かれています。(たとえば、Rails 4.1でのある変更について事前に知っていなければ、何時間もの苦労をしていたことでしょう。)
それだけでなく、アップグレードガイドでは、なぜその変更が必要なのかという理由も説明してくれます。これが重要です。どの提案に従うべきで、どれを無視してもよいのかを判断できるからです。
Rails 4.2の変更点をより深く理解したいなら、リリースノートも読んでみてください。すぐに使える魅力的な新機能が多数紹介されています。少なくとも、アップグレードを完了させるモチベーションにはなるはずです。
段階的にアップグレードする
新しいRailsバージョンへ移行するときは、まず最新のポイントバージョンまでアップグレードしてください。 マイナーバージョンを飛ばしてはいけません。
たとえば、4.1.6から4.2へアップグレードしたい場合は、4.1.6 → 4.1.9 → 4.2という順序で進めます。4.0.12から始める場合は、4.0.12 → 4.0.13 → 4.1.9 → 4.2となります。作業量が増えるように感じるかもしれませんが、長い目で見れば時間の節約になります。
なぜでしょうか?
Railsリリースの最新ポイントバージョンには、最も充実した非推奨(deprecation)警告が含まれているからです。
非推奨警告の有用性を過小評価しないでください。段階的にアップグレードすれば、何が壊れるのか、そしてそれをどう防げばいいのかを正確に教えてくれます。 一気に飛ばしてしまうと、アプリが突然動かなくなり、原因すら分からなくなってしまいます。
また、ポイントバージョン間のアップグレード(たとえば4.0.9から4.0.13)でテストが壊れた場合、それはメジャーまたはマイナーアップグレードでも壊れる可能性が高い問題です。しかし、変更箇所が少ないほうが、デバッグも修正も格段に簡単になります。
そこで、次の手順を実行しましょう:
- 現在使っているRailsバージョンの最新ポイントリリースへアップグレードします。
bundle updateの妨げになっている他のgemをアップグレードします。- テストを修正し、必要に応じてコミットします。
- 非推奨警告を解消し、必要に応じてコミットします。
- 次のマイナーまたはメジャーバージョンのRailsへアップグレードし、これを繰り返します。
テストを頼りにする
Railsをアップグレードするとき、テストは「何かがおかしい」ことを最初に教えてくれるサインになります。 テストは最初に実行し、最初に修正すべきものです。テストがほぼパスするようになる前に、Railsアプリを起動させようとするのは無駄骨です。
gemをアップグレードする
テストが失敗し、自分のコードが原因ではないように見える場合、通常はgemの更新が必要だというサインです。
Railsのアップグレード作業中は、gemのアップグレードをするには最悪のタイミングです。 アプリの多くの部分が変化しているため、Railsのアップグレードが原因なのか、gemのアップグレードが原因なのか、それとも自分のミスなのか判断が難しくなります。
しかし、Railsの内部構造に深く依存しているgemもあるため、これは避けて通れません。たとえばsassの内部でエラーが起きたら、sass-rails gemをアップグレードすることになります。状況が悪化しないことを祈りましょう。
たくさんメモを取る
特に厄介なRailsアップグレードに直面している場合は、試行錯誤が必要になるでしょう。デバッグをしたり、コードを調整したり、テストを書き換えたりすることになるはずです。
こうした作業をしていると、自分が行った変更を忘れてしまいます。 ほぼうまくいったけれど完全ではなかった試み。次に確認しようとしていたテスト。あとでコードを変更すべき場所。同じようにRails 4.2へアップグレードしている同僚に共有したいヒントなど。
だからこそ、たくさんメモを取りましょう。すべて書き留めてください。試したこと、変更したファイル。失敗の原因に関する仮説と、それが正しかったかどうか。更新が必要だったgem。奇妙に見える動作と、後で詳しく調べたい点。
変更を加えてロールバックした後、「実はそれが正解だった」と気づいても、何をしたのか思い出せない——そんな事態は避けたいはずです。だから、書き留めておきましょう。
その他の役立つリソース
コメント欄では、Miha RekarさんがRailsDiffを紹介していました。これは異なるRailsバージョンで生成された新しいRailsアプリ同士の差分を表示してくれるツールです。不要になった設定パラメータや、追加すべき新しい設定を把握するのに絶好の方法です。
また、Daniel KehoeさんはRVMとRVM gemsetを使ったRubyとRailsのアップデートに関する包括的なガイドを執筆しています。
最高のRailsアップグレード体験を
スムーズに進むRailsアップグレードもあれば、数日〜数週間に及ぶ難しいプロジェクトになることもあります。それはアプリの規模、依存関係、Railsが変更した内容によって変わります。しかし、この記事の手順に従えば、可能な限り最高のアップグレード体験が得られるはずです。
もうRails 4.2に移行しましたか? アップグレードはどうでしたか? gemをいくつか更新するだけで済みましたか? それとも、まだ最後に残った失敗するテストを追いかけているところでしょうか?
(お知らせ:2月11日に「Practicing Rails」をリリース予定です! 25%割引の早期アクセス特典を受けられるのは、あと数週間だけです。)
-
【Rails】Flashメッセージの使い方を徹底解説!alertとnoticeの違いからflash.nowまで
Flashメッセージとは? Flashメッセージとは、Railsアプリケーションのユーザーに対して、自分の操作によって何が起こったのかを伝えるための仕組みです。 メッセージの例: 「パスワードが正しく変更されました」(確認メッセージ) 「ユーザーが見つかりません」(エラーメッセージ) Flashメッセージはコントローラーで設定し、ビューで表示します。ユーザーはそのメッセージを受け取って、次のアクションにつなげられます。 それでは、具体的な使い方を見ていきましょう! Flashメッセージの基本的な使い方 通知メッセージは、flashヘルパーメソッドを使って扱います。 flashオブジェクトは
-
RailsアプリでTwitterログインを実装する方法:OmniAuth-Twitter完全ガイド
このチュートリアルでは、RailsアプリケーションのユーザーがTwitterアカウントを使ってログインできるようにする方法を解説します。OAuthなどのツールのおかげで、この実装はとても簡単に行えるようになりました。 今回は、OmniAuth用のTwitterストラテジーを含む「OmniAuth-Twitter」を使用します。 それでは始めましょう! はじめに:プロジェクトの準備 まずはRailsアプリケーションを生成します。ターミナルで以下のコマンドを実行してください。 rails new Tuts-Social -T 次にGemfileを開き、bootstrap gemを追加します。