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のエラーメッセージは、対応方法まで親切に教えてくれますね。