【问题标题】:CanCanCan not stopping posts being editedCanCanCan 无法停止正在编辑的帖子
【发布时间】:2016-09-15 15:09:35
【问题描述】:

我正在制作一个 Rails 项目,并且正在尝试实现 CanCanCan。我安装了 gem 并运行了命令。然后我将此添加到ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:

      user ||= User.new # guest user (not logged in)
      if user.admin?
        can :manage, :all
      else
        can :update, Post do |post|
          post.user == user
        end
        can :destroy, Post do |post|
          post.user == user
        end
        can :create, Post
        can :read, :all
      end

  end
end

但是,现在在我的项目中,如果我登录到其他用户,我仍然可以编辑其他用户的帖子。

对我所缺少的任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails cancancan


    【解决方案1】:

    通过将load_and_authorize_resource 添加到我的posts_controller 解决了该错误

    【讨论】:

    • 很高兴听到它...然后,为了其他 SO 用户的利益,您应该将问题标记为已回答
    【解决方案2】:

    根据 CanCanCan 文档,

    仅当存在实际实例对象时才评估块。 检查类的权限时不评估它(例如在 索引操作)。这意味着任何不相关的条件 对象上的属性应该移到块外。

    不要这样做

    can :update, Project do |project|
      user.admin? # this won't always get called
    end
    

    这样做

    can :update, Project if user.admin?
    

    所以不是

    can :update, Post do |post|
      post.user == user
    end
    can :destroy, Post do |post|
      post.user == user
    end
    

    改变该做的

    can :update, Post if post.user == user
    can :destroy, Post if post.user == user
    

    【讨论】:

    • 您好,我尝试了您的建议,但似乎并没有阻止用户编辑其他用户的帖子
    【解决方案3】:

    尝试类似can :manage, Post, :user_id => user.id

    正如您在https://github.com/ryanb/cancan/wiki/defining-abilities 看到的那样

    【讨论】:

    • 您好,我尝试了您的建议,但似乎并没有阻止用户编辑其他用户的帖子
    【解决方案4】:

    我的设置方式与 nersoh 相同,该方法对我有效。您是否尝试过在控制器中授权 Posts 资源?例如,

    class PostsController < ActionController::Base
      load_and_authorize_resource
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 2022-01-12
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多