我的Rails应用程序中包含以下表格,其中包含权限:
id: INTEGER, name: TEXT, controller: TEXT, action: TEXT, description: TEXT, created_at: TEXT, updated_at: TEXT
我想在我的应用程序中编写或更新所有控制器操作,以便它们可以用于CanCanCan
中的角色/用户。
这可以通过点击build
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
因此,我们的想法是循环遍历所有控制器和操作,然后调用调用write_permission
来添加或更新数据库。
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的权限......
答案 0 :(得分:1)
我认为问题在于您在first
上使用Permission
方法的方式。请参阅文档:http://apidock.com/rails/ActiveRecord/FinderMethods/first
你可以这样写:
Permission.where(controller: controller, action: cancan_action).first