初めて記事を投稿します。
現在Web系企業への転職を目指してポートフォリオを作成中です。
その中で、ログインユーザーのセッション管理にsessionメソッドは使用していましたが、
それ以外の用途で、sessionメソッドを使用して、ある機能を実装できたので
記事にして共有したいと思います。
【参考】 sessionメソッドについて Railsチュートリアル
#元ネタ
現在作成しているアプリにて、登録済みユーザーによって投稿された記事を、
・新しい投稿順
・「いいね」が多い順
での表示に切り替えられるそれぞれ用のボタンを作成しました。
どちらのボタンを選択しているかの判別用パラメータを、
ログインしているユーザーは、DBにてそのユーザーのレコード上に保存していたのですが、
ログインしていないユーザーの場合の管理方法について悩んでいました。
#解決策
Railsのsessionメソッドを使用することで解決しました!
以下該当コードです。
class SampleController < ApplicationController
def home
if current_user
current_user.update(order_option: params[:option]) if params[:option]
option = current_user.order_option
else
session[:not_logged_in] = 0 if session[:not_logged_in].nil?
session[:not_logged_in] = params[:option].to_i if params[:option]
option = session[:not_logged_in]
end
if option.zero?
@articles = Article.order(created_at: :desc)
elsif option == 1
@articles = Article.order(like_counts: :desc)
end
end
end
(略)
<%= render @articles %>
ログインユーザー(current_user)がいない場合の処理を
sample.rbのelseのブロックに記述しています。
ポイントは、
else
session[:not_logged_in] = 0 if session[:not_logged_in].nil?
の箇所によって、ユーザーが最初にサイトにアクセスした時は
session[:not_logged_in]
は生成されていない(nil)ため、
0に初期化されてブラウザに保存されます。
以降は記事の表示順切り替え用ボタンがクリックされた時に
params[:option]
をコントローラに渡すようにしておけば、
session[:not_logged_in] = params[:option].to_i if params[:option]
によってsession[:not_logged_in]
が更新されます。
そして、その値によって、以下のコードにより記事の並び順を変更します。
if option.zero?
@articles = Article.order(created_at: :desc)
elsif option == 1
@articles = Article.order(like_counts: :desc)
end
また、この情報は sessionメソッドの仕様により、
ブラウザが閉じられた時に破棄されます。
#sessionメソッドが、求める仕様を満たしていた
ログインしていないユーザーが記事の表示順を切り替えられるようにするためには、
実装する機能が以下の仕様を満たす必要がありました。
- 他ユーザーの利用状況に左右されない
- 最初にページにアクセスした時だけパラメータを初期化する
- サイトの閲覧を終了し、次回サイトにアクセスした時は情報が残されていない
そして、以下にsessionメソッドの仕様を記載します。
- ブラウザ単位で情報をやりとりできる
- パラメータの初期化を、URL初回アクセス時のみ行わせることができる
- 有効期限が過ぎる、またはブラウザを閉じれば情報が破棄される
sessionメソッドの仕様3つ目は、機能に求める仕様3つ目を
厳密には満たしていませんが、ほぼ条件を満たしており、
今回実装した機能にはうってつけでした。
なお、実装する機能1つ目の仕様はDBでも制御できますが、
2、3つ目の機能をDBで制御しようとすると結構難しいと思います
(私には方法が思いつきませんでした)。
#最後に
sessionメソッドを他の用途で使っている例を見たことがなかったので、
知見の共有になればと思い、今回記事を執筆しました。
お役に立てれば幸いです。
なお、実務未経験で完全独学者がたまたま思いつき、作成した機能なので
「このような実装は実際には行わない」
「ここはこうすると良い」
等、指摘事項がある内容であるかもしれませんので、
その際はコメントでご指導いただけると幸いです。
最後までお読みいただき、ありがとうございました!