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