Я использую Devise и CanCan для аутентификации пользователей и администрирования ролей, ограничивающих доступ к частям моего приложения Rails 4 для определенных пользователей.Почему сеанс current_user становится нулевым при обновлении пользователя?
У меня возникли проблемы с обновлением пользователя. Обновление работает нормально, и пользовательский объект в db обновляется по мере необходимости, но мой сеанс пользователя теряется при следующем redirect_to
действии моего действия пользователя. current_user
становится nil
, что означает, что CanCan ограничивает доступ к действию пользователя.
Почему current_user
стал nil
после обновления, если это не происходит при других действиях (например, создавать, уничтожать и т. Д.)?
Эти настройки DEViSE в моей модели пользователя:
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
Благодаря трг. Переадресация работает нормально, если я обновляю пользователя без обновления пароля. Итак, согласно тому, что вы говорите, мне нужно снова войти в систему, если он или она изменяет пароль, правильно? – asprotte
да - в частности 'sign_in @user,: bypass => true' - вы можете увидеть больше информации здесь: https://github.com/plataformatec/devise/wiki/How-To%3a-Allow-users-to- edit-their-password – trh
Отлично, что работает! Спасибо, тр! – asprotte