2012-06-20 72 views
0

要麼我缺少某些東西,要麼不瞭解其他帖子/說明。我正在嘗試使用標準模型以及無模型控制器來執行基於數據庫的功能。在DB我:CanCan數據庫能力無法使用無模式控制器

| action_name | object_type    | 
|:index  |Tag      | 
|:index  |AssetDashboardController | 

標籤會工作得很好...... AssetDashboardController被作爲一個類,而不是一個符號傳遞,因此失敗can

Rails的控制檯嘗試用繩子& constantize:在DB

1.9.3p194 :017 > "AssetDashboardController".constantize 
=> AssetDashboardController 
1.9.3p194 :018 > "Tag".constantize 
=> Tag(id: integer, tag_unique: string, room_monitor_id: integer, star_id: integer, map_id: integer, tracked_type_id: integer, tracked_object_id: integer, x: integer, y: integer, created_at: datetime, updated_at: datetime) 
1.9.3p194 :019 > 

「AssetDashboard」 到位 「AssetDashboardController」 的獲取NameError: uninitialized constant AssetDashboard和 「asset_dashboard」 到位 「AssetDashboardController」 的獲得NameError: wrong constant name asset_dashboard

能力.rb:

def initialize(user) 
    user ||= User.new #in case user is not passed there is a blank user to validate against 

    if user.is_implementer? 
     can :manage, :all 
    elsif user.user_permissions.exists? 
     user.user_permissions.each do |user_permission| 
     can user_permission.permission.action_name.to_sym, user_permission.permission.object_type.constantize 
     end 
    elsif !user.role.nil? 
     user.role.default_role_permission.each do |role_permission| 
     can role_permission.permission.action_name.to_sym, role_permission.permission.object_type.constantize 
     end 
    else 
     can :read, [Asset, Patient, StaffMember, AssetDashboardController, PatientDashboardController, DashboardController] 
    end 
    end 
end 

AssetDashboardController.rb

class AssetDashboardController < ApplicationController 
    authorize_resource :class => false 

    def index 

    end 

end 

如果我把這個Ability.rb: can [:show, :index], :asset_dashboard 它工作正常。

請讓我知道是否有更多我可以添加。

的Rails 3.0.13,慘慘1.67,紅寶石1.9.3p194上RVM

回答

0

我結束了幾件事情。我設置數據庫字段,然後在ability.rb我這樣做:

can user_permission.permission.action_name.to_sym,user_permission.permission.no_model_permission? ? user_permission.permission.object_type.to_sym : user_permission.permission.object_type.constantize 

如果no_model_permission是假的我用DB中的OBJECT_TYPE的constantize方法。如果沒有,我使用to_sym。

與非模型object_types我必須使用「asset_dashboard」爲object_type的,而不是「AssetDashboardController」

有點哈克,但我想不出更好的解決方案

0

can [:show, :index], :asset_dashboard

這看起來正確的,因爲你是在審批的控制器存取的動作。 can :readcan :manage我相信是典型意義上的資源,即模型支持。

+0

我寧願不更換DB用'can [:show,:index],:asset_dashboard'等硬編碼片斷查找。我試圖弄清楚爲什麼AssetDashboardController的數據庫條目失敗。 – ScottJShea

+0

@ScottJShea我想,如何cancan的工作'非寧靜控制器'這裏的鏈接https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers – Viren

+0

另見'authorize_resource'這裏https:// github。 COM/ryanb /康康舞/維基/中授權 - 控制器 - 操作 –