2016-11-04 9 views
1

私は権限が含まれている私のRailsアプリでは、次の表を持っている中で)(整数の無効な値を取得しますCanCanCanのロール/ユーザーに対して使用できることはレール

これは、だから、アイデアは、それはすべてのコントローラとアクションをループし、その後、DBを追加または更新するためのコールwrite_permissionを呼び出すことである私のPermissionsController

def build 
    write_permission("all", "manage", "Everything", "All operations", true) 
    ApplicationController.subclasses.each do |controller| 
    if controller.respond_to?(:permission) 
     controller_class, description = controller.permission 
     write_permission(controller_class, "manage", description, "All operations") 
     controller.action_methods.each do |action| 
     if action.to_s.index("_callback").nil? 
      action_desc, cancan_action = eval_cancan_action(action) 
      write_permission(controller_class, cancan_action, description, action_desc) 
     end 
     end 
    end 
    end 
end 

build方法を押すことで達成されます。

protected 

    def eval_cancan_action(action) 
    case action.to_s 
     when "index", "show", "search" 
     cancan_action = "read" 
     action_desc = I18n.t :read 
     when "create", "new" 
     cancan_action = "create" 
     action_desc = I18n.t :create 
     when "edit", "update" 
     cancan_action = "update" 
     action_desc = I18n.t :edit 
     when "delete", "destroy" 
     cancan_action = "delete" 
     action_desc = I18n.t :delete 
     else 
     cancan_action = action.to_s 
     action_desc = "Other: " << cancan_action 
    end 
    return action_desc, cancan_action 
    end 

    def write_permission(controller, cancan_action, name, description, force_id_1 = false) 
    permission = Permission.first(:conditions => ["controller = ? and action = ?", controller, cancan_action]) 
    if not permission 
     permission = Permission.new 
     permission.id = 1 if force_id_1 
     permission.controller = controller 
     permission.action = cancan_action 
     permission.name = name 
     permission.description = description 
     permission.save 
    else 
     permission.name = name 
     permission.description = description 
     permission.save 
    end 
    end 

は、しかし、私はこのエラーを取得する:

invalid value for Integer(): "{:conditions=>[\"controller = ? and action = ?\"" 

のみINTEGERがIDですと、私は、問題が何であるかを理解することはできません。

しかし、我々はIDを使用して最初の許可を見つけていない...

答えて

1

は、私は問題はあなたがPermissionfirst方法を使用している方法であると思います。ドキュメントを参照してください:http://apidock.com/rails/ActiveRecord/FinderMethods/first

あなたが代わりにそれをこのように記述することができます。

Permission.where(controller: controller, action: cancan_action).first

+0

私は 'Permission.find_by(コントローラ:コントローラ、アクション:cancan_actionが)だと思う'同じ結果を生成します。 – moveson