#はじめに
sessionは「ウィザード形式」等でデータを保持させた状態で遷移先に移動する時に使用します。
###目次
- セッションについて
- 実装例
- 最後に
#1. セッションについて
セッションは情報を一時的に記憶しておく仕組みです。
Railsにおいてセッションは、sessionというオブジェクトにハッシュのような形でデータが格納されます。
例えば、会員登録の際ページが切り変わって進んでいくようなサイトを想定します。
この場合、セッションを使い入力した情報を一旦sessionに格納して、次のページに遷移してそこで展開させる必要があります。
#2実装例
###前提
前提としてdeviseを用いてページを遷移しながら会員情報を保存する事を想定してます。
###開発環境
ruby 2.6.5
rails 6.0.0
devise 4.7.3
##2.1 データの保持
それでは実装してみますー
class Users::RegistrationsController < Devise::RegistrationsController
def new
@user = User.new
end
def create
@user = User.new(sign_up_params)
unless @user.valid?
render :new and return
end
session["devise.regist_data"] = {user: @user.attributes}
@address = @user.build_address
render "new_address"
end
他いろいろ記述してますがsessionに注目します。
session["devise.regist_data"] = {user: @user.attributes}
{user: @user.attributes}はsessionにハッシュオブジェクトの形で情報を保持させたい時、attributesメソッドを用いてデータを整形しています。
つまり、attributesされた@userのデータがハッシュの状態でsessionに入ってます。
これで、session["devise.regist_data"]に入力情報が代入され、保持さてた状態になります。
##2.2 展開させる
次に、データを保持した状態でページを遷移して展開します。
class Users::RegistrationsController < Devise::RegistrationsController
#省略
def create_address
@user = User.new(session["devise.regist_data"]["user"])
@address = Address.new(useraddress_params)
if @address.valid?
@user.build_address(@address.attributes)
@user.save
session["devise.regist_data"]["user"].clear
sign_in(:user, @user)
else
render "new_address"
end
end
こちらもいろいろ記述してますが一番上の@userに注目。
@user = User.new(session["devise.regist_data"]["user"])
session["devise.regist_data"]["user"]について説明します。
{user: 〇〇}でデータを持すと ["user"]を使う必要がある。
また、sessionは配列で情報を入れるので以下のように情報を持す事もできます。
session["devise.regist_data"] = {user: @user.attributes, address: @user.address}
これで無事遷移先のページでsessionが展開できて@userに代入ができました。
あとは@userに代入されてるデータを使って保存などが可能です。
#まとめ
今回は「ウィザード形式」でdeviseを用いた際のsessionの使いた方を紹介しました。
####最後に
私はプログラミング初学者ですが、同じ様に悩んでる方々の助けになればと思い、記事を投稿しております。
それでは、また次回お会いしましょう〜