Rails 5.1 Default Settings Changes
config.action_view.form_with_generates_remote_forms: true
# 以前の書き方
<%= form_for @post, remote: true do |f| %>
# Rails 5.1での新しい書き方
<%= form_with(model: @post) %> # デフォルトでdata-remote="true"が付与
# 生成されるHTML
<form action="/posts" method="post" data-remote="true">
...
</form>
影響と問題パターン
- すべてのform_withがデフォルトで非同期送信になる
- JavaScriptを無効にしているブラウザでフォームが正しく動作しない可能性
- Turbolinksとの競合が発生する可能性
config.assets.unknown_asset_fallback: false
# 設定による違い
image_tag("missing_image.jpg")
# true の場合
# => /assets/missing_image.jpg を出力
# false の場合
# => Sprockets::Rails::Helper::AssetNotFoundError
影響と問題パターン
- 存在しない画像への参照時にエラーが発生するようになる
- 動的に生成される画像パスで問題が発生しやすい
- 開発環境とプロダクション環境で挙動が異なる可能性がある
- プレースホルダー画像の仕組みを使っている場合に修正が必要
対応策
# フォームの非同期送信を個別に制御
<%= form_with(model: @post, local: true) %> # 同期送信
# アセット参照のエラーハンドリング
def asset_exist?(path)
if Rails.configuration.assets.compile
Rails.application.precompiled_assets.include? path
else
Rails.application.assets_manifest.assets[path].present?
end
end