ruby-on-rails - 为什么在更新用户时 current_user session 变为 nil?

标签 ruby-on-rails devise ruby-on-rails-4 cancan

我正在使用 Devise 和 CanCan 进行用户身份验证和管理角色,以限制某些用户访问我的 Rails 4 应用程序的部分内容。

我在更新用户时遇到了一些问题。更新工作正常,数据库中的用户对象得到更新,但我的用户 session 在以下 redirect_to 中丢失了我的用户显示操作。 current_user变成 nil这意味着 CanCan 限制对用户显示操作的访问。

为什么current_user成为nil更新后,当其他操作(例如创建、销毁等)不会发生这种情况时?

这些是我的用户模型中的设计设置:

devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:login]

这是我的 users_controller.rb 的更新方法:
class UsersController < ApplicationController

  load_and_authorize_resource
  before_filter :authenticate_user!

  def update
    @user = User.find(params[:id])
    if params[:user][:password].blank?
        params[:user].delete(:password)
    end

    respond_to do |format|
      if @user.update_attributes(user_params)
        format.html { redirect_to user_path, :notice => 'User was successfully updated.' }
        format.json { head :ok }
      else
        format.html { render :action => "edit" }
        format.json { render :json => @user.errors, :status => :unprocessable_entity }
      end
    end
  end
end

这是我的 ability.rb 文件:
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if defined?(user.role_id)
      if user.role? :admin, user.role_id
        can :manage, :all
      elsif user.role? :hauler, user.role_id
        can :manage, [User,Trip,Invoice], user_id: user.id.to_s
      else
        can :create, :Trip
      end
    end
  end
end

最佳答案

这取决于正在执行的更新。 session 使用特定的用户数据位进行序列化。

例如,更新密码将导致 session 无效,因为加密的密码是序列化散列的一部分,如果更改, session 将无法再引用原始的加密密码。

关于ruby-on-rails - 为什么在更新用户时 current_user session 变为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18489373/

相关文章:

ruby-on-rails - Rails 将并发永久链接回退路由到另一个 Controller

ruby-on-rails - Rails 3/设计 : Password salt no longer being created?

ruby-on-rails - rspec 接收方法未按预期工作

javascript - 如何汇总所有显示的交易?

mysql - rails 4 : how to use UNIX_TIMESTAMP with group YEAR

ruby-on-rails - Solr (Sunspot) 运行,但不会启动

ruby-on-rails - 如何强制 Rack 解决通常的 "You have already activated rack..."错误?

session - 使用devise重置Rails 3 session

ruby-on-rails - 防止用户中的 updated_at 字段在使用设备登录时被修改

ruby-on-rails - Simple_form 必填字段不起作用 - Ruby on Rails