createアクションでエラーのフラッシュメッセージが表示されない(2)

実現したいこと

Diary#newのviewページで, 投稿に失敗した際にエラーのフラッシュメッセージを表示させたい。 Diaryモデルでは投稿の日付(:diary_date)が重複しないようにvalidationを設定している。 すでに投稿済みの日付(2020-01-13)で再度投稿した際に、フラッシュメッセージでエラー表示を行いたいです。

メンターの指摘

flashオブジェクト にはmessage, message_type共に格納されている。 つまり、controler−>viewまでのデータフローは正しく行われている。

ボトルネックとなっていると考えられる部分はview以降の処理になると推測できる。

確認すべき点

  • Class alert alert-〇〇は正しくCSSが適用されているか
  • 基本的に、alertに反応してフラッシュメッセージを発火するのはBootStrapによって定義されているため

考えたこと1

そもそもflashオブジェクトとは何か?

flashはアクション間で一時的なプリミティブ型(String, Hash, Array)を渡す機能を提供する。flashに渡された値は次のアクションに渡され、flashは初期化される。flashは通知やアラート機能を実装する際に大きな力を発揮する。...

対処

  • _flash_messages.html.erbのクラス名が正しいかを確認する。
    • alert-danger は正しい。
  • Bootstrapが正しく読み込まれているか?
    • _flash_message.html.erbにclass名がalert alert-dangerのdivを書いて、正しく表示されるたか試してみる。結果、正しく表示された。

新しい仮説

Trouble getting flash notice to display in page viewに以下の記述があった。

your layout will not update because Turbolinks is preventing it from doing so. As unlikely as this is, you may wish to test disabling turbolinks for the link you're loading.

Turbolinksがレイアウトの更新を妨害しているとの指摘。このTurbolinksの無効化を試すと良いらしい。

Handling form errors with Rails automatically? #85 に以下の記述があった。

Rails 5 introduced form_with which by default treats all forms as AJAX unless you pass the :local option. The solution for Turbolinks should probably be applied to Rails to work with form_with also. See https://github.com/rails/rails/blob/master/guides/source/working_with_javascript_in_rails.md

Rails5のform_withヘルパーには:localオプションを渡さない限りデフォルトでAJAXが有効になっている。

対処2

  • form_withヘルパーにlocal: trueを渡す

結果

エラーのフラッシュメッセージが表示される様になった。

考えたこと2

  • Turbolinksとは何か?
  • AJAXがなぜflashメッセージの表示を妨害しているのか?