如何在rails会话到期时触发操作?

时间:2014-06-03 20:28:47

标签: ruby-on-rails ruby session ruby-on-rails-4

我有一位用户可以登录我的Ruby on Rails应用程序。我自己用会话控制器编写了这些函数。当会话到期时,我还在session_store.rb中设置了一个时间。

这一切都很好,但另外我想跟踪用户登录或注销的时间。现在,我可以跟踪用户手动完成的登录和注销。但是当一个会话到期时我的会话#destroy"选项未触发,因此未设置注销时间。

当会话到期或会话被铁路杀死时,是否有可能触发操作?

谢谢!

更新

抱歉,我应该包含一些代码:

app/controllers/sessions_controller.rb
class SessionsController < ApplicationController

  def new
    if !current_user.nil?
      redirect_to start_path
    end
  end

  def create
    user = User.find_by_username(params[:username])
    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      UserTracing.create(user_id: user.id, sign_in_at: DateTime.now)
      redirect_to start_path, notice: I18n.t("text logged_in")
    else
      flash.now.alert = I18n.t("error username_or_password_invalid")
      render "new"
    end
  end

  def destroy
    @id = current_user.id
    session[:user_id] = nil
    UserTracing.where(user_id: @id).order(sign_in_at: :asc).last.update_attributes(sign_out_at: DateTime.now)
    redirect_to root_url, notice: I18n.t("text logged_out")
  end
end

1 个答案:

答案 0 :(得分:0)

这很容易。

您所要做的就是使用会话助手方法

  1. 创建会话设置为过期的时间 session [:expires_at] = Time.now + minutes_to_run * 60
  2. 创建一个检索这次的函数。
  3. 在控制器中具有在加载此页面之前运行的功能,以检查当前时间是否大于会话设置为过期的时间。该解决方案使用javascript setTimeout()来确保页面被刷新,否则您将不得不等待用户重新加载。这样,您的应用程序将刷新页面。

这是一篇详细介绍此想法的博客文章。 https://medium.com/@thatlovelypract/rubyonrails-timed-session-a5de0cf70f3b