【问题标题】:CanCan issues with RailsRails 的 CanCan 问题
【发布时间】:2016-12-08 22:28:25
【问题描述】:

我遇到了一个问题,我的 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

地图属于场所并具有场所 ID。我可以在场地页面的地图索引部分中获取地图:

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

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

【问题讨论】:

  • 不要使用图像,而是将代码粘贴到 SO 中。此外,包括控制器代码以及能力文件代码。为什么你必须向我们展示你的 UI,这与任何事情有什么关系?最后,使用用户,current_user.company.venues.pluck(:id) 的输出是什么?
  • 输出是场地 ID,即 1:公司负载 (0.3ms) SELECT companies.* FROM companies WHERE companies.id = 4 LIMIT 1 (0.4ms)选择venues.id FROM venues WHERE venues.company_id = 4 => [1]
  • 使用控制台,您尝试的地图的venue_id 是什么show

标签: ruby-on-rails ruby cancancan


【解决方案1】:

我不完全确定你是 #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

【讨论】:

  • 谢谢,这绝对解决了创建地图的问题。
  • 对于#show 问题,我将地图的venue_id 作为字符串而不是像venue.id 那样的整数。 :facepalm: 再次感谢您的帮助!
  • 哈哈,一切都好!感谢您抽出宝贵时间向#show 说明您的问题。对于发现cancancan 的人来说,这真的很重要,因为他们可能会遇到同样的误解。
【解决方案2】:

尝试在 load_and_authorize_resource 中明确声明类

load_and_authorize_resource class: "Map"

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多