LoginSignup
0
1

More than 3 years have passed since last update.

【Rails】sessionメソッドを使った非ログインユーザーの情報管理

Last updated at Posted at 2020-01-06

初めて記事を投稿します。

現在Web系企業への転職を目指してポートフォリオを作成中です。
その中で、ログインユーザーのセッション管理にsessionメソッドは使用していましたが、
それ以外の用途で、sessionメソッドを使用して、ある機能を実装できたので
記事にして共有したいと思います。

【参考】 sessionメソッドについて Railsチュートリアル

元ネタ

現在作成しているアプリにて、登録済みユーザーによって投稿された記事を、
・新しい投稿順
・「いいね」が多い順
での表示に切り替えられるそれぞれ用のボタンを作成しました。

どちらのボタンを選択しているかの判別用パラメータを、
ログインしているユーザーは、DBにてそのユーザーのレコード上に保存していたのですが、
ログインしていないユーザーの場合の管理方法について悩んでいました。

解決策

Railsのsessionメソッドを使用することで解決しました!
以下該当コードです。

sample.rb
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
home.html.erb
(略)
<%= render @articles %>

ログインユーザー(current_user)がいない場合の処理を
sample.rbのelseのブロックに記述しています。

ポイントは、

sample.rb
    else
      session[:not_logged_in] = 0 if session[:not_logged_in].nil?

の箇所によって、ユーザーが最初にサイトにアクセスした時は
session[:not_logged_in] は生成されていない(nil)ため、
0に初期化されてブラウザに保存されます。

以降は記事の表示順切り替え用ボタンがクリックされた時に
params[:option] をコントローラに渡すようにしておけば、

sample.rb
      session[:not_logged_in] = params[:option].to_i if params[:option]

によってsession[:not_logged_in] が更新されます。
そして、その値によって、以下のコードにより記事の並び順を変更します。

sample.rb
    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メソッドを他の用途で使っている例を見たことがなかったので、
知見の共有になればと思い、今回記事を執筆しました。
お役に立てれば幸いです。

なお、実務未経験で完全独学者がたまたま思いつき、作成した機能なので
「このような実装は実際には行わない」
「ここはこうすると良い」
等、指摘事項がある内容であるかもしれませんので、
その際はコメントでご指導いただけると幸いです。

最後までお読みいただき、ありがとうございました!

0
1
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
1