smptmhr / el-training

株式会社万葉の新入社員教育用カリキュラム
https://everyleaf.com/
2 stars 0 forks source link

BUG : create/update失敗時にエラーメッセージが表示されない #25

Closed smptmhr closed 2 years ago

smptmhr commented 2 years ago

内容

タスクの新規作成/編集(更新)の際、バリデーションエラーになる入力がされるとこれまではエラーメッセージが出力されていた。 それが #19 をマージ後は表示されなくなった。 成功時のメッセージは問題なく表示される。

発見の経緯

23 でタスクのCRUDテストを作成をしており、これまで通っていたテストが #19 のmerge後は通らなかったことで発見。

原因と思われる箇所

appp/views/layouts/application.html.erbの10行目

<%= javascript_importmap_tags %>

ここをコメントアウトして実行したところエラーメッセージが表示されることを確認。

smptmhr commented 2 years ago

検証したこと

サーバー側のメッセージ生成

appp/views/layouts/application.html.erbのエラーメッセージ表示箇所で、メッセージ自体が生成されているかを確認

  <body>
    <% flash.each do |message_type, message| %>
      <% p message_type %>
      <% p message %>
      <div class="alert alert-<%= message_type %>"><%= message %></div>
    <% end %>
    <%= yield %>

編集→名前を空にしてsave changes サーバーの出力

Started PATCH "/tasks/80" for ::1 at 2022-06-13 15:18:39 +0900
Processing by TasksController#update as TURBO_STREAM
  Parameters: {"authenticity_token"=>"[FILTERED]", "task"=>{"name"=>"", "description"=>"", "start_date"=>"2022-06-21", "necessary_days"=>"3", "progress"=>"未着手", "priority"=>"中"}, "commit"=>"Save changes", "id"=>"80"}
  Task Load (0.2ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = $1 LIMIT $2  [["id", 80], ["LIMIT", 1]]
  ↳ app/controllers/tasks_controller.rb:61:in `find_task_with_err_handling'
  Rendering layout layouts/application.html.erb
  Rendering tasks/edit.html.erb within layouts/application
  Rendered shared/_error_messages.html.erb (Duration: 0.7ms | Allocations: 411)
  Rendered tasks/_form.html.erb (Duration: 6.3ms | Allocations: 3005)
  Rendered tasks/edit.html.erb within layouts/application (Duration: 6.7ms | Allocations: 3162)
"danger"
"Failed to update task"
  Rendered layout layouts/application.html.erb (Duration: 21.5ms | Allocations: 8741)
Completed 200 OK in 26ms (Views: 22.2ms | ActiveRecord: 0.2ms | Allocations: 10014)

下から3,4行目、エラーメッセージは正しく生成されていることは確認できた。

aleart-dangerのみ表示されないのか?

現状、フラッシュメッセージが確認できないのはclassがalert-dangerの場合のみ。 alert-successの場合は表示ができている。 クラスが原因なのかを検証する。

<div class="alert alert-<%= message_type %>"><%= message %></div>

alert-<%= message_type %>alert-dangerに変更して、 正しくメッセージが表示されていた更新成功パターンを見てみる。

スクリーンショット 2022-06-13 15 33 16

問題なくメッセージが表示されてるので、メッセージのタイプが原因ではないことを確認。

意図しないタイミングでフラッシュメッセージが表示される

tasks_controller内のupdateアクション

    if @task.update(task_params)
      flash[:success] = I18n.t 'task_update_success'
      redirect_to @task
    else
      flash.now[:danger] = I18n.t 'task_update_failed'
      render 'edit'
    end

のelseのパターン(更新失敗)をflash.nowからflashに書き換えた上で、 編集→名前を空にする→save changes編集をキャンセル の順に操作すると、詳細ページ(show)でエラーが出力される。

スクリーンショット 2022-06-13 15 48 09

flash.nowのままではこの挙動は現れなかった。