使用 CanCanCan - 我显然在做一些明显错误的事情

Using CanCanCan - I am clearly doing something obviously wrong

晚上好,

CanCanCan很棒;但是,我认为我遗漏了一些非常明显的东西,因为我的模型逻辑非常简单。

第 1 步和第 3 步有效。但是,第 2 步不起作用 - 如果另一个用户已登录,则尝试查看某物;他们看到 "CanCan::AccessDenied" 除非这是他们的事。

Ability.rb

    if user.present?
      can :manage, List, user_id: user.id 
    else
      can [:read, :search], List 
    end

上面代码段中的 user.present? linked/locked 到 current_user 吗?我试过省略.present?但是,这仍然呈现 CanCan::AccessDenied。

遇到这个意外错误,我以为下面这样的东西会起作用,可惜不行。

    if user.present? 
      can :manage, List, user_id: user.id 
    elsif @list.find(params[:id]).user != user
      can [:read], List
    else
      can [:read, :search], List 
    end

对于后代,请在 Roman Alekseiev 提供的内容之上找到我的解决方案。

应用程序控制器

class ApplicationController < ActionController::Base
    load_and_authorize_resource :parent
    load_and_authorize_resource :child, through: :parent

ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= ::User.new

    if user.new_record?
      can [:read, :search], Parent
      can [:read], Child
    else
      can [:read, :search], ::Parent
      can [:read, :create, :delete], Child
      can :manage, Parent, user_id: user.id
    end
end

如何使用视图中的能力,例如显示。

<% if can? :create, @parent => Child %>
present the child markup/content
<% end %>

More Reading via the official documentation

从我的角度来看:

  def initialize(user)
    user ||= ::User.new

    if user.new_record?
      can [:read, :search] ::List
    else
      can [:read, :comment], ::List
      can :manage, ::List, user_id: user.id
    end

尝试过这篇文章,source