要么我遗漏某些东西,要么不理解其他帖子/说明。我正在尝试使用标准模型以及无模型控制器来执行基于数据库的功能。在DB中我有:
| action_name | object_type |
|:index |Tag |
|:index |AssetDashboardController |
标签将正常工作... AssetDashboardController作为类而不是符号传递,因此失败can
。
Rails控制台尝试使用string& constantize:
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
Ability.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
它工作正常。
如果我可以添加更多内容,请告诉我。
RVM 3.0.13,Cancan 1.67,RVM上的Ruby 1.9.3p194
答案 0 :(得分:0)
can [:show, :index], :asset_dashboard
看起来正确,因为您正在批准控制器中可访问的操作。 can :read
和can :manage
我认为是典型意义上的资源,即模型支持的资源。
答案 1 :(得分: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
为false,我在DB中的object_type上使用constantize方法。如果不是我使用to_sym。
使用非模型object_types我必须使用“asset_dashboard”作为object_type而不是“AssetDashboardController”
有点hacky但我无法找到更优雅的解决方案