我正在使用Devise和CanCan进行用户身份验证和管理角色,限制某些用户访问部分Rails 4应用程序。
我遇到了更新用户的一些问题。更新工作正常,数据库中的用户对象按预期更新,但我的用户会话在以下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
这是我的能力.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
答案 0 :(得分:4)
这取决于正在执行的更新。会话使用某些用户数据进行序列化。
例如,更新密码将导致会话无效,因为加密密码是序列化哈希的一部分,如果更改,会话将无法再引用原始加密密码。
答案 1 :(得分:0)
为我工作
def update
respond_to do |format|
if @user.update(user_params)
sign_in(@user, :bypass=>true)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
魔术发生在:bypass =&gt; true