Rails 的 CanCan 问题

CanCan issues with Rails

我的 rails 应用程序的所有者无法访问我的地图控制器创建和显示方法,使用 CanCanCan gem 进行权限控制。

这是我当前配置的能力模型:

class Ability
include CanCan::Ability

def initialize(user)

 if user.role.name == 'owner'

   can :manage, Map, venue_id: user.company.venues.pluck(:id)

 end
end

来自 user.company.venues.pluck(:id) 的输出:

 Company Load (0.3ms)  SELECT  `companies`.* FROM `companies` WHERE `companies`.`id` = 4 LIMIT 1
   (0.4ms)  SELECT `venues`.`id` FROM `venues` WHERE `venues`.`company_id` = 4
 => [1] 

这是我的地图控制器代码:

class MapsController < ApplicationController
  before_action :authenticate_user!
  respond_to :html, :json
  load_and_authorize_resource

  def index
    respond_with(@maps)
  end

  def new
   respond_with(@maps)
  end

  def create
    @map = Map.create(map_params)
    if @map.save
      respond_to do |format|
        flash[:notice] = t('floors.created')
        format.json
      end
    else
      flash[:alert] = t('floors.error')
    end
  end

  def show
    respond_with(@map)
  end

  def edit

  end

  def update

  end

  def map_params
    params.require(:map).permit(:alias, :venue_id, :map)
  end

end

地图属于场馆并且有 venue_id。我可以在场地页面的地图索引部分获取地图:

但是当我尝试创建地图或转到地图显示页面时,我收到 CanCan 访问被拒绝错误:

关于为什么 CanCanCan 允许我查看地图索引但在创建或查看地图显示控制器时访问被拒绝的任何想法。

尝试在 load_and_authorize_resource

中明确说明 class

load_and_authorize_resource class: "Map"

我不完全确定你是 #show 行动,但绝对不应该:

can :manage, Map, venue_id: condition

原因是您的资源 @map = Map.new 还没有场地。

它将检查:

@map.venue_id
=> nil
current_user.company.venues.pluck(:id)
=> [1]
@map.venue_id ==  current_user.company.venues.pluck(:id)
# aka     nil == [1]
=> false

尝试以下操作:

can [:new, :create], Map
can [:show, :edit, :update, :destroy], Map, venue_id: condition