关闭浏览器时会话不会被破坏 - RailsTutorial.org

时间:2015-09-17 01:59:51

标签: ruby-on-rails ruby session login railstutorial.org

通过Michael Hartl的railstutorial.org,我在第8章(特别是8.2.3)。当前的问题是实现一个会话以保持用户跨多个视图登录,但本节中实现的功能应该是一个临时会话,当浏览器窗口到期时(将用户注销)关闭了。以下是教科书中的陈述:

  

如果您完全退出浏览器,您还应该能够验证应用程序是否忘记了您的登录状态,要求您再次登录以查看上述更改。

我已在Google Chrome和Firefox上测试过此功能 - 我成功登录,导航到多个页面(确保我的会话持续超出log_in重定向)然后关闭浏览器 - 但是当我登录时重新加载网络应用程序,我仍然登录。我已经将所有代码完全复制为文本中所写的内容,但无济于事。作为参考,这里是我的sessions_helper.rb文件:

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Returns the current logged-in user (if any).
  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end

end

这是我的sessions_controller.rb文件(destroy操作尚未实施,因为我还没有在给出Logout按钮任何功能的文本中指出这一点:

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      # Log the user in and redirect to the user's show page.
      log_in user
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination' 
      render 'new'
    end
  end

  def destroy
  end

注意:在您的回答中,请不要建议添加替代代码或更改现有代码(除非您看到代码I&#39;已发布)。教科书假定这是工作代码,并且不需要对其进行任何改动以使其正常运行。

2 个答案:

答案 0 :(得分:2)

请检查您的config/initializers/session_store.rb文件。应该有像

这样的东西
Rails.application.config.session_store :cookie_store, key: '_app_session'

您必须将expire_afternil值添加到选项中:

Rails.application.config.session_store :cookie_store, key: '_app_session', expire_after: nil

应用此更改后,会话将在用户关闭浏览器时过期。您可以阅读有关Cookie过期here

的更多信息

答案 1 :(得分:2)

我知道我已经迟到了七个月,但是我有同样的问题,经过一些额外的谷歌搜索,发现它在两年前被回答here

问题是浏览器设置,我想大多数人都会使用这些设置:&#34;当Firefox启动时,显示我上次的窗口和标签&#34;或者&#34;启动时,从上次停止的地方继续。&#34;这个问题现在作为教程中的脚注(Chapter 8, Note 1)被提及,但作者最不得不说的是

  

...当然Rails无法控制这种行为。