仅在Rails中列出当前用户的会话

时间:2017-01-18 10:42:30

标签: ruby-on-rails ruby session

我正在使用activerecord-session_store gem在数据库中存储会话。

我在SessionsController中列出了使用此方法的会话:

def index
  @sessions = Session.all
end

但是,这会列出应用程序中的所有会话,而不仅仅是当前登录用户的会话。会话的数据库表包含以下列:id, session_id, data, created_at, updated_at因此没有user_id列可供过滤。

我可以使用user_id

访问会话数据中的Marshal.load(Base64.decode64(session.data))['user_id']

如何使用此数据过滤列表?到目前为止,我能想到的是在视图中做一个条件,将它与current_user.id

进行比较

e.g。

<% @sessions.each do |session| %>
  <% if Marshal.load(Base64.decode64(session.data))['user_id'] == current_user.id %>
    <!-- LIST SESSION -->
  <% end %>
<% end %>

2 个答案:

答案 0 :(得分:2)

如果您使用 @echo off if not exist c:\OldDir.txt echo. > c:\OldDir.txt dir /b "C:\Spektra\Gelen" > c:\NewDir.txt set equal=no fc c:\OldDir.txt c:\NewDir.txt | find /i "no differences" > nul && set equal=yes copy /y c:\Newdir.txt c:\OldDir.txt > nul if %equal%==yes goto :eof rem Your batch file lines go here ********** c:\unzip.exe (the_new_files) -d (destination) ******************* 作为后端,则可能只需设置序列化to be :json

PostgreSQL

并针对postgres查询ActiveRecord::SessionStore::Session.serializer = :json 字段。

如果您使用json,则可以实现自己的会话类:

MySQL

并实现ActionDispatch::Session::ActiveRecordStore.session_class = MySessionClass 挂钩,明确地将pre_commit保存在表格的相应列中。之后只需查询此列。

答案 1 :(得分:1)

如果我没弄错,您可以在控制器中使用相同的呼叫current_user;因此,如果您在该控制器/路由上设置before_filter,则可以使用相同的代码来过滤current_user.id

类似的东西:

before_filter :get_user_session

def get_user_session
  Session.all.each do |session|
    if Marshal.load(Base64.decode64(session.data))['user_id'] == current_user.id
      # do things
    end
  end
end