0

私は何かが欠けているか、他の投稿/指示を理解していません。私は、標準モデルとモデルレスコントローラーを使用してデータベースベースの機能を実行しようとしています。DBには次のものがあります。

| 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 > 

DBの「AssetDashboardController」の代わりに「AssetDashboard」を取得NameError: uninitialized constant AssetDashboardし、「AssetDashboardController」の代わりに「asset_dashboard」を取得します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 に動作します。

追加できるものが他にあるかどうか教えてください。

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

4

2 に答える 2

0

can [:show, :index], :asset_dashboard

コントローラでアクセス可能なアクションを承認しているので、それは正しいように見えます。 can :readそしてcan :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

falseの場合no_model_permission、DBのobject_typeでconstantizeメソッドを使用します。そうでない場合は、to_symを使用します。

モデル以外のobject_typesでは、object_typeに「AssetDashboardController」ではなく「asset_dashboard」を使用する必要があります

少しハッキーですが、もっとエレガントな解決策を見つけることができませんでした

于 2012-06-22T17:38:17.707 に答える