前書き
今現在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を追加する