LoginSignup
0
0

More than 3 years have passed since last update.

session。 コントローラー間でデータの受け渡しができる魔法のコード

Posted at

どうも!!!
チャンクノです。
最近はチーム開発が始まりブログ書くかコード書くかで悩んでいます。
ただブログは備忘録でもあるし、忘れてしまったら意味ないので書く時間を作ろうかなと思います。

さて今回は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についてでした!!!
それでは皆様のよきプログラミングライフを祈って🙏🙏🙏

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0