どうも!!!
チャンクノです。
最近はチーム開発が始まりブログ書くかコード書くかで悩んでいます。
ただブログは備忘録でもあるし、忘れてしまったら意味ないので書く時間を作ろうかなと思います。
さて今回はsessionというものについて書きます。
正直あまり深くは理解はしていません🙇♂️
あくまでも使い方の一例程度にとらえていただければと思います!!!
自分たちのコードを元に書いていきます!!!
sessionの書き方
sessionは以下のような書き方になります
sessionに代入する値
↓
session[:sns] = user_params[:name]
↑
ここの名前はなんでもいい
次は自分たちのコードを実例にとって書いていきます。
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
//下のcallback_from(provider)からのデータをsessionに入れています。
session[:sns] = callback_from :facebook
@user = User.find_oauth(request.env["omniauth.auth"])
if @user.persisted?←userがすでにDBに存在するかどうかの確認
else
redirect_to users_sign_up_profile_path and return
end
end
private
def callback_from(provider)
@user = User.find_oauth(request.env["omniauth.auth"])
if @user.persisted?
sign_in_and_redirect @user, event: :authentication
set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format?
else
session["devise.#{provider}_data"] = request.env["omniauth.auth"].except("extra")
end
end
end
急にややこしい!!!
ここでは下のcallback_from(provider)からデータが送られてきているんだな程度でいいです。
細かいところは気にせずいきましょう。
redirectでデータを送りたいコントローラーのパスを指定します。
今回は下記に送っています。
def new_profile←今回の送り先
binding.pry←ここにbinding.pryをかけてsession[:sns]を入力
@user = User.new
session[:user] = @user
if session[:sns]!=nil
session[:user]["nickname"] = session[:sns]["info"]["name"]
session[:user]["email"] = session[:sns]["info"]["email"]
end
end
一見データがきているのかよく分からないですが来ています。
binding.pryなどを使えばデータがちゃんと送られていることがわかります。
session[:sns]で出なかったらsession[:sns] = callback_from :facebookをそのまま打ち込んでみてください。データが送られてきていることが確認できるはずです。
ここで、session[:user]["nickname"]この記述や、session[:sns]["info"]["name"]この記述の仕方が気になるかと思います。
これは
モデルクラスが入っている箱
↓
session[:user]["nickname"] = session[:sns]["info"]["name"]
↑
モデルクラス内部のカラム名
こういうことです。
ちなみに["info"]["name"]と書いてあるのはinfoの中にあるnameだからこう記述します。
12: def facebook
13: session[:sns] = callback_from :facebook
=> 14: binding.pry
15: @user = User.find_oauth(request.env["omniauth.auth"])
16: if @user.persisted?
17: else
18: redirect_to users_sign_up_profile_path and return
19: end
20: end
[1] pry(#<Users::OmniauthCallbacksController>)> session[:sns]
=> {"provider"=>"facebook",
"uid"=>"",
"info"=>
{"name"=>"名無し権兵衛",
"email"=>"",
}
これでどういうことかわかりますかね😅
文字で説明するの難しい!!!
最後に気をつけなければならないのが、sessionはデータを目的地に飛ばすために使うものなので別途保存をしなければなりません!!!
行う動作が全て済んだ段階でsaveして保存しましょう!!!
コントローラー間でデータの受け渡しのやり方が分からず困っていたのですがsessionを使えば簡単にできました。
教えてくれたチームメイトに感謝ですね🤗
チームの中で自分が一番技術力ないのでいつも与えてもらってばっかで申し訳ないです😰
いつか自分も何かを与えられるようにがんばるぞい💪
ということでsessionについてでした!!!
それでは皆様のよきプログラミングライフを祈って🙏🙏🙏