Ruby on rails Rails自动登录,可以';不要注销

Ruby on rails Rails自动登录,可以';不要注销,ruby-on-rails,ruby-on-rails-3,session,Ruby On Rails,Ruby On Rails 3,Session,解决:抱歉,伙计们,我自己解决了这个问题,我做了一个db:reset并修复了一个导致一些问题的before过滤器方法 每当我在本地主机上运行我的应用程序时,我都会立即登录。我在多个浏览器上尝试过这个,每次都会发生同样的事情。注销功能也不起作用。我不知道该怎么办。我这里有一个应用程序的回购 我的问题是,为什么我的注销功能不起作用,为什么每次我转到localhost时都会自动登录?我在遵循Hartl的教程,但有一些偏差,所以如果你已经完成了教程,这应该看起来很熟悉 这是会话控制器页面 class S

解决:抱歉,伙计们,我自己解决了这个问题,我做了一个db:reset并修复了一个导致一些问题的before过滤器方法

每当我在本地主机上运行我的应用程序时,我都会立即登录。我在多个浏览器上尝试过这个,每次都会发生同样的事情。注销功能也不起作用。我不知道该怎么办。我这里有一个应用程序的回购

我的问题是,为什么我的注销功能不起作用,为什么每次我转到localhost时都会自动登录?我在遵循Hartl的教程,但有一些偏差,所以如果你已经完成了教程,这应该看起来很熟悉

这是会话控制器页面

class SessionsController < ApplicationController

def new
end

def create
  user = User.find_by_email(params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    #sign user in
    sign_in user
    redirect_back_or user
  else
    #create an error
    render 'new'
    flash.now[:error] = "Invalid email/password combination"
  end
end

def destroy
  sign_out
  redirect_to root_url
end

end
module SessionsHelper

  def sign_in(user)
    session[:remember_token] = user.remember_token
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find_by_remember_token(session[:remember_token])
  end

  def current_user?(user)
    user == current_user
  end

  def sign_out
    self.current_user = nil
    session.delete(:remember_token)
  end

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)
  end

  def store_location
    session[:return_to] = request.url
  end

end
这是我的用户模型页面

class User < ActiveRecord::Base

  attr_accessible :name, :email, :password, :password_confirmation

  has_secure_password

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  validates :name,  presence: true, length: { maximum: 50 }

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { 
  case_sensitive: false }

  validates :password, length: {minimum: 6}

  validates :password_confirmation, presence: true

  private
     def create_remember_token
      self.remember_token = SecureRandom.urlsafe_base64
     end

end

我在您发布的代码中看到的唯一问题是,当前的用户方法当前没有检查会话中是否存在memory_令牌

  def current_user
    @current_user ||= User.find_by_remember_token(session[:remember_token])
  end
如果未设置记住标记,则上述代码将导致一个查询,该查询将尝试查找没有记住标记的用户。如果它找到这样一个用户,它将登录该用户

虽然我看到您有一个用于为用户设置记住标记的after_create回调,但您的开发数据库可能包含这样一个用户,该用户是在添加回调之前创建的

以这样一种方式更改代码可能是一个好主意,即在查询db之前检查是否存在remember_标记

def current_user
 if session_token[:remember_token]
  @current_user ||= User.find_by_remember_token(session[:remember_token])
 end
end

我通过在用户控制器中执行db:reset和注释出redirect\u signed\u in\u user before filter方法解决了这个问题。谢谢大家的帮助。

您的问题没有答案,您可以使用Desive或auth logic来处理所有注册和登录内容。没错,我想从头开始,或者至少通过Hartl的教程来完成。在sessions controller中,您的模型或代码行第9行中定义的身份验证方法在哪里?user.authenticate(params[:session][:password])authenticate是在模型的
users.rb
中找到的
has\u secure\u password
方法的一部分。代码在哪里托管?有趣的是,我实际上解决了它。一个before筛选器方法出现问题。我还做了一个
rakedb:reset
,插入了所有新用户。不过谢谢你的帮助,我会考虑你说的记住你的代币。
def current_user
 if session_token[:remember_token]
  @current_user ||= User.find_by_remember_token(session[:remember_token])
 end
end