0

要么我遗漏了一些东西,要么不理解其他帖子/说明。我正在尝试使用标准模型和无模型控制器来实现基于数据库的能力。在数据库中,我有:

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

标记可以正常工作... AssetDashboardController 作为类而不是符号传递,因此失败can

Rails 控制台尝试使用字符串和常量化:

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 它工作正常。

如果我可以添加更多内容,请告诉我。

RVM 上的 Rails 3.0.13、Cancan 1.67、Ruby 1.9.3p194

4

2 回答 2

0

can [:show, :index], :asset_dashboard

看起来不错,因为您正在批准控制器中可访问的操作。 我相信是典型意义上的资源,即模型支持can :readcan :manage

于 2012-06-20T17:01:03.407 回答
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为假,我在数据库中的 object_type 上使用 constantize 方法。如果没有,我使用 to_sym。

对于非模型 object_types,我必须对 object_type 使用“asset_dashboard”而不是“AssetDashboardController”

有点hacky,但我想不出更优雅的解决方案

于 2012-06-22T17:38:17.707 回答