Рельсы gem pundit

У меня такой хеш:

MAPPING = {
   create: [:admin],
   update: [:admin],
   delete: [:admin],
   index: [:all]
}

И мне нужно динамически создать метод pundit в классе политики. Мне нужно найти в хэше сопоставления все элементы, которые имеют роль администратора, и создать методы политики:

def create?
   true
end

def update?
   true
end

Таким образом, мне не нужно все время повторять код. Как я могу это сделать ? Спасибо.


person gui12344455    schedule 24.10.2017    source источник


Ответы (2)


В приведенном ниже коде определяется метод для каждого ключа, значение которого содержит :admin. Имя метода - это ключ, приведенный к строке с добавленным вопросительным знаком. Каждый определенный метод возвращает true.

MAPPING.each do |action, roles|
  define_method("#{action}?") do
    true
  end if roles.include?(:admin)
end
person hoffm    schedule 24.10.2017
comment
как лучше всего хранить эти хеши отображения? беспокойство ? - person gui12344455; 25.10.2017
comment
Это действительно зависит от более широкого контекста. Если константа специфична для этого класса, она может просто жить внутри него. - person hoffm; 25.10.2017
comment
проблема в том, что у меня нет доступа к ролям в области класса. Поэтому я не могу запустить define_method для динамического создания методов. - person gui12344455; 25.10.2017
comment
Как у есть доступ к хешу? - person hoffm; 25.10.2017

Это код, который я использую:

    class CarPolicy < ApplicationPolicy
      attr_reader :user, :record

      def initialize(user, record)
        @user = user
        @record = record
      end

      PERMISSION_KEY_MAPPING = {
        index: [:admin]
      }

      PERMISSION_KEY_MAPPING.each do |action, roles|
        define_method("#{action}?") do
          true
        end if user.roles.include?(:admin)
      end
    end

Линия:

end if users.roles.include?(:admin)

Не работает, потому что у меня нет доступа к user.roles.

person gui12344455    schedule 25.10.2017