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
我的 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
中明确说明 classload_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