Rails5.2で作ったシステムを6.0にアップデートした際に、ハマったポイントをまとめました。
| 元のバージョン | アップデートしたバージョン |
|---|---|
| 5.2.2 | 6.0.0.beta3 |
1. Webpackerの標準インストール
Rails6では、Webpackerが標準でインストールされるようになりました。
というわけで、Rails5.2まででWebpackerを入れていなかった場合は、インストールしましょう。
$ bundle exec rails webpacker:install
2. CoffeeScriptからES2015(ES6)への変換
Rails6では、ActionCableのjavascriptパッケージがCoffeeScriptからES2015(ES6)に変換されました。
というわけで、もしRails5.2まででCoffeeScriptを使っていると、以下のエラーが発生します。
LoadError: cannot load such file -- coffee_script
これは、tmpディレクトリ下のキャッシュをクリアすればOKです。
$ bundle exec rails tmp:cache:clear
3. ActionDispatch::HostAuthorizationの導入
Rails6では、DNSリバインディングやHostヘッダインジェクションの対策として、ActionDispatch::HostAuthorizationが導入されました。
3-1. ActionDispatch::HostAuthorizationとは?
ActionDispatch::HostAuthorizationは新たに追加されたミドルウェアで、ホワイトリストによってホストを認証します。
ホワイトリストによる認証なので、リストに登録されたホストは通しますが、それ以外のホストへのリクエストはエラーになります。
3-2. デフォルト設定
デフォルトでは、developmentにのみ以下3つの値が指定されています。
Rails.application.config.hosts = [
IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
IPAddr.new("::/0"), # All IPv6 addresses.
"localhost" # The localhost reserved domain.
]
というわけで、IPとlocalhostへのリクエストはデフォルトで通ります。
stagingやproductionなどdevelopment以外の環境は、デフォルトでは何も指定されていないので、自分で一からホストを指定する必要があります。
3-3. ホストの指定
ホストを指定する時は、Rails.application.config.hostsに以下のように追加します。
module MyApp
class Application < Rails::Application
...
config.hosts << "product.com"
...
end
end
また、以下の形で追加すると全てのサブドメインを指定することができます。
config.hosts << ".product.com"
3-4. エラーメッセージ
ちなみに、3-3. ホストの指定 を行わずにproduct.comでアクセスしようとすると、以下のエラーメッセージが出力されます。
Blocked host: product.com
To allow requests to product.com, add the following to your environment configuration:
config.hosts << "product.com"
やはりRailsのエラーメッセージは、対応方法まで親切に教えてくれますね。