###rails tutorial 8章を勉強中にparamsが分からなかった
rails tutorial8章 8.1.3節 ユーザーの検索と認証 に差し掛かった時、ん?と思った。
この節ではユーザーがログイン画面に入力したemailとpasswordを受け取って、
データベース上に存在しかつ正しいemailとpasswordの組み合わせになっているかを
確認するものだ。
params[:session]
{ session: { password: "foobar", email: "user@example.com" } }
画面に入力されたデータはこの形で受け取るらしいが、ここで詰まった。
###what is paramsとsession ??
params?session?そんなの書いた覚えは無い…railsのお約束みたいなものなのかな?
ググってたらいいページを2つ見つけた。
ピカわか【Rails】paramsについて徹底解説!
[WEBCAMP NEVI【Rails入門説明書】paramsについて解説]
(https://web-camp.io/magazine/archives/18258)
このページのおかげでかなり理解が深まりました。
###They are…
画面に入力された際に生まれたデータは
すべてparamsメソッドにハッシュの形式でまとめられるparamsメソッドの中にいくつかあるハッシュのうち、
emailとpasswordはsessionメソッドの中に収納される
とりあえずこんな感じに理解しました。
というのは間違いで、正しくは
params → メソッド
session → キー名
でした。
詳しく言うと、
params:ActionController::Parameters というclassによってユーザーが入力した情報などをもったインスタンスが生成される
そこで生成されたインスタンスを返すのがparamsというメソッド
session:paramsが返すインスタンスに含まれているキー名の一つ。
この記事のコメントを見ていただければより分かりやすいかと思います。
コメントでのご指摘ありがとうございました。
###おまけにdebugger
debuggerでparams見たらもっと分かりそう。
そんな感じでdebugger使ってみました。
def create
user = User.find_by(email: params[:session][:email].downcase)
debugger #ここdebugger
if user && user.authenticate(params[:session][:password])
# ユーザーログイン後にユーザー情報のページにリダイレクトする
else
# エラーメッセージを作成する
render 'new'
end
end
11: else
12: # エラーメッセージを作成する
13: render 'new'
(byebug) params
<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"LxkdeujFgCWan2zWZJXo+NAsl6FWTvQuOIleI6sr/rGV37pREiUahEJn8GH6Jet8YHs5/xT2tJIQBMIWpBz5EQ==", "session"=><ActionController::Parameters {"email"=>"spdfmasd@gmail.com", "password"=>"s;dlfka;sd"} permitted: false>, "commit"=>"Log in", "controller"=>"sessions", "action"=>"create"} permitted: false>
(byebug) params[:session]
<ActionController::Parameters {"email"=>"spdfmasd@gmail.com", "password"=>"s;dlfka;sd"} permitted: false>
(byebug) params[:utf8]
"✓"
ちゃんとsessionがキー名だとわかりますね。
###終わりに
どれくらいの人がここで躓くのかわかりませんが、今後同じような状況で悩む人の手助けになればと思います。
間違いなどありましたらぜひともご指摘をお願いいたします。