ume

rails tutorial フラッシュのバグについて

前書き

今現在rails tutorialを学習している初心者です。 学習中にフラッシュのバグに遭遇したので今日はその原因と解決策を共有することでまだ私のような初心者の方の力になればと思い記事を作成しています。

目次 

①フラッシュのバグ発生、私の期待した挙動、問題点について.
②原因と解決策.

フラッシュのバグ発生、私の期待した挙動、問題点について.

バグの内容フラッシュが消えない.

.
私の期待した挙動はlog inページで2つのフォームの中を空欄のままログインすると画面上部に'Invalid email/password をlog inページの中でだけ表示させようとしました.

ただ問題はhelpページにページ遷移してもフラッシュが消えず残ったままであること.

経緯. ログインが成功したり失敗すると画面上部に何かしらの文章を一時的に表示しようと思いフラッシュという機能(好きな文字を一時的に表示する機能)を実装しようと以下のコードをコントローラーに入力しました

# POST /login 
  def create 
    user = User.find_by(email: params[:session][:email].downcase)
     if user && user.authenticate(params[:session][:password])
       #成功
       log_in user
       redirect_to user 
     else 
       #失敗
       flash[:danger] = 'Invalid email/password 
       render "new"
     end 
  end 

②原因と解決策

原因は2つ ①flashの挙動を漠然と理解していただけで具体的に理解できていなかった.
flash + redirect toとflash + renderの組み合わせの挙動の違いを理解していなかった.

①について.
私のflashの理解は文字を一時的に画面に表示する。 正しい理解は一時的にではなく「次のリクエスト(postリクエストやgetリクエストなど)がくるまで表示する」 ②redirect_to newとした場合 users/newにリクエストが送られて⇨new.htmlファイルが表示される。なのでnew.htmlファイルが開かれた時にはもうすでに1回リクエスト飛ばしたことになるのでnew.htmlファイルから別のファイルにページ遷移した時フラッシュは消える。 ただrender new を使うとリクエストを経由せず直接呼び出すのでnew.htmlファイルを開いた時にはまだリクエストは0回なのでhelpページに遷移したとしてもそこでようやく1回目のリクエストがカウントされるのでフラッシュが消えなかった。

解決策

flashとrenderを組み合わせて使う場合

 flash[:danger] = 'Invalid email/password 

 flash.now[:danger] = 'Invalid email/password 

.nowを追加する