2016-12-05 70 views
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并创建新的数据集。

很显然,我忽略了一些东西......什么?

+0

跳出来的第一件事是围绕[namespace](https://github.com/CanCanCommunity/cancancan/wiki/authorizing-controller-actions#custom-class)没有引号。您也可以尝试在控制器方法级别进行调试,以查看它是否与rails控制台一样返回。 我的问题我猜也是在这个控制器上有任何公共方法?如果是的话,为什么不告诉它跳过这些,只是简化为'load_and_authorize_resource,class:Myns :: Dashboard' –

+0

我认为,因为他希望指示'通过'语句。 –

+0

我从这个项目中删除CanCanCan Gem并编写我自己的授权。 – Christian

回答

0

你是否在你的ApplicationController中覆盖current_ability来将第二个参数提供给你的Ability构造函数?我不确定服务器版本如何获取控制台示例显示的相同信息。