2016-12-05 67 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構造函數?我不確定服務器版本如何獲取控制檯示例顯示的相同信息。