0

我正在使用带有继承资源的 cancan,我遇到了一个奇怪的问题(可能是错误?),我为用户定义了一个编辑权限,突然他们被授权访问 /edit 操作,尽管能力返回 false。这就是我正在经历的行为。

class VenuesController < ApplicationController
  inherit_resources
  authorize_resource
end

如果没有定义能力,我的非管理员用户会从 /venues/1/edit 重定向到主页。但是,一旦我定义了一个 :update 能力,无论该能力返回真还是假,我都不会被重定向。这是我要定义的能力:

能力.rb

can :update, Venue do |venue|
  venue.admin_ids.map{|a| a.to_s}.include? user.id.to_s
end

这将返回正确的值,正如我在测试中看到的以及在我的视图中进行的健全性检查:

场地/edit.html.haml

= can? :update, @venue
#returns false

所以,如果我在编辑操作中并且我的视图显示“我无法更新”,那么不应该可以从这个页面重定向我吗?作为双重检查,我尝试了

can :update, Venue do |venue|
  false
end

仍然没有运气......我只是觉得奇怪的是,没有任何能力定义,我被重定向,但是当我定义一个返回 false 的能力时,尽管视图层适当地告诉我我无法编辑,但我没有被重定向。有任何想法吗?这是一个错误吗?难道我做错了什么?

此外,我不仅可以看到编辑操作,而且还可以实际向资源发出 put 请求并保存资源。

4

0 回答 0