2016-11-04 2 views
1

У меня есть следующая таблица в моем приложении Rails, который содержит разрешение:Получение недопустимого значения для Integer() в рельсах

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 является идентификатор.

Но мы не нашли первое разрешение, используя идентификатор ...

ответ

1

Я думаю, что проблема связана с тем, как вы используете метод first на Permission. Обратитесь к документации: http://apidock.com/rails/ActiveRecord/FinderMethods/first

Вы могли бы написать это так, вместо этого:

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

+0

Я думаю, что 'Permission.find_by (контроллер: контроллер, действие: cancan_action)' будет производить тот же результат. – moveson