目的
- ログアウト機能作成中にルーティングに問題は無いのにルーティングエラーが出た時の話をまとめる。
結論
- ログアウトボタンを押下した時の設定で
methodをpostに指定していなかった。
エラーまでの経緯
-
ログアウト機能を作りたかった。
-
Bootstrapを用いたheaderにログアウトボタンを作成し、押されるとルーティング経由でコントローラのアクション内で
session[:user_id]にnilを入れてログアウト処理を行うものだった。 -
下記に各ファイルの一部の抜粋を記載する。
-
headerのビュー
<li class="navbar-item"><a href="/logout" class="nav-link">ログアウト</a></li> -
ルーティング
post "logout" => "users#logout" -
コントローラのアクション
def logout session[:user_id] = nil flash[:notice] = "ログアウトしました" redirect_to("/login") end -
ビューからの送り先のルーティングの
logoutにスペルミスもない。
原因
- ビューからルーティングのpostへ送るときは
methodをpostにしてあげないといけないのにしてない。 -
postに送るときは指定してあげないとpost "logout" => "users#logout"を見つけられない。
解決方
-
取り急ぎつまりまくったので
link_toを使用してログアウトできるかどうかだけ確認した。 -
下記に修正したheaderのビューファイルの内容を記載する。
<!--<li class="navbar-item"><a href="/logout" class="nav-link">ログアウト</a></li>--> <%= link_to("ログアウト", "/logout", {method: "post"}) %> -
ログアウトすることができた。
残件
-
link_toを使用したログアウトは行えたものの、Bootstrapのheaderでのmethodをpostにする方法を知らないのでそこを解決する。 - タグの中で
method="post"すればいけそうだがうまく行かなかったので解決する。 - 若干体調が悪いため今日はここまでとする。