【问题标题】:CanCanCan User edit his own profileCanCanCan 用户编辑自己的个人资料
【发布时间】:2018-10-17 14:33:58
【问题描述】:

我在这里遇到了一个非常奇怪的问题。这是在我的ability.rb 中造成所有麻烦的行

    can [:edit, :update, :destroy], User, id: user.id

当我启动 rails 控制台时,我得到了预期的行为:

u = User.last
a = Ability.new(u)
a.can?(:edit, u)
=> true
a.can?(:edit, User.first)
=> false

但是,当我启动 Web 浏览器,以用户身份登录并尝试编辑另一个浏览器时,CanCanCan 保持沉默。 如果我将can 替换为cannot,我将无法编辑任何用户。就好像它没有查找条件一样。

我的UsersController 把这条线放在首位

authorize_resource

我被困住了,任何帮助将不胜感激。

cancancan 2.3.0
轨道 5.2.1

【问题讨论】:

  • 请提供minimal reproducible example。尝试显示重现问题的完整代码,而不是代码描述。例如,您是否有可能在 Ability 中有一些附加逻辑有时会覆盖此定义?或者可能正在使用不同的Ability 类?或者可能authorize_resource 已被覆盖?错误可能是由各种事情引起的,如果没有完整的复制示例,我无法确定。
  • 您是否尝试过重新启动您的 Rails 服务器?在更改ability.rb 后,我无法确定是否需要

标签: ruby-on-rails ruby cancancan


【解决方案1】:

确保您的实例 (@user) 在 authorize_resource 操作运行之前已加载,否则它将检查用户是否可以访问某些用户can?(:edit, User),始终如此),而不是确切的用户。

before_action :load_user, except:[:index, :new, :create]
authorize_resource

...

private def load_user
  @user = User.accessible_by(current_ability, action_name.to_sym).find(params[:id])
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-29
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多