在rails

时间:2016-11-04 11:22:33

标签: ruby-on-rails ruby

我的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的权限......

1 个答案:

答案 0 :(得分:1)

我认为问题在于您在first上使用Permission方法的方式。请参阅文档:http://apidock.com/rails/ActiveRecord/FinderMethods/first

你可以这样写:

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

相关问题