0
我在一个命名空间CanCanCan:阅读能力,但可以更新和创造
namespace :myns do
resources :dashboards do
resources :advertisements
end
end
我加check_authorization到应用程序控制器有一个嵌套的资源和控制器配置
class Myns::DashboardsController < ApplicationController
load_and_authorize_resource :myns_dashboard, class: Myns::Dashboard
end
class Myns::AdvertisementsController < ApplicationController
load_and_authorize_resource :myns_dashboard, class: Myns::Dashboard
load_and_authorize_resource :myns_advertisement, class: Myns::Advertisement, :through => :myns_dashboard
而能力等级是:
class Ability
include CanCan::Ability
def initialize(user, dashboard_id)
user ||= User.new # guest user (not logged in)
can :show, Myns::Dashboard, id: dashboard_id
can :read, Myns::Advertisement, :myns_dashboard => { :id => dashboard_id }
end
end
当我在控制台中加载用户的能力并询问是否此用户可以更新ID 6的广告,它说“不”
user = User.first
ability = Ability.new(user, 1)
advertisement = Myns::Advertisement.find 6
ability.can? :update, advertisement
=> false
但是,当我打开我的浏览器,登录与ID为1的用户直接浏览到http://localhost/myns/dashboards/1/advertisements/6/edit,显示该网站没有任何错误。我可以编辑字段并提交更改,并将其保存在数据库中。我可以打开http://localhost/myns/dashboards/1/advertisements/new并创建新的数据集。
很显然,我忽略了一些东西......什么?
跳出来的第一件事是围绕[namespace](https://github.com/CanCanCommunity/cancancan/wiki/authorizing-controller-actions#custom-class)没有引号。您也可以尝试在控制器方法级别进行调试,以查看它是否与rails控制台一样返回。 我的问题我猜也是在这个控制器上有任何公共方法?如果是的话,为什么不告诉它跳过这些,只是简化为'load_and_authorize_resource,class:Myns :: Dashboard' –
我认为,因为他希望指示'通过'语句。 –
我从这个项目中删除CanCanCan Gem并编写我自己的授权。 – Christian