attr_accessor в контроллере для хранения разрешений

Я использую attr_accessor в своих контроллерах для хранения разрешений, которые установлены в методе, определенном в applicationController, но у меня возникают проблемы. Если я сделаю это:

class ApplicationController < ActionController::Base

    attr_accessor :perms

    def self.set_permissions *permissions
      self.perms = permissions
    end

    def check_permissions
        print self.perms
    end

end

Затем рельсы утверждают, что perms= не существует

if I do:

class ApplicationController < ActionController::Base

    attr_accessor :perms

    def self.set_permissions *permissions
      @perms = permissions
    end

    def check_permissions
        print @perms
    end
end

@perms в check_permissions равно nil в любом дочернем контроллере, я проверил, какие методы экземпляра доступны, используя: print self.instance_variables, но @perms не появился; вероятно, потому что @perms устанавливается для экземпляра класса, а не для экземпляра объекта контроллера, созданного при вызове действия

Что происходит? Rails не любит attr_accessor на контроллерах? Как я могу заставить это работать, чтобы я мог установить разрешения в классе и сделать их доступными для любых объектов этого класса, чтобы я мог установить их следующим образом:

class Api::ApiController < ApplicationController

    set_permissions :api
    before_action :check_permissions, except: :set_permissions

end

Я должен использовать self.set_permissions, иначе он утверждает, что set_permissions не существует, когда я пытаюсь их установить (потому что это метод объекта, а не метод класса)

РЕДАКТИРОВАТЬ: Для уточнения я хочу, чтобы разрешения были установлены в контроллере (но были разными для каждого контроллера); быть одинаковым для любого экземпляра этого контроллера (т.е. экземпляра объекта, созданного для действия) или любых контроллеров, которые наследуются от этого контроллера (например, контроллер узла наследуется от контроллера API и поэтому использует те же разрешения), если он не был определен в этом унаследованном контроллере отдельно (контроллер токенов наследуется от контроллера API, но должен быть свободен от разрешений, чтобы человек мог получить токен, не требуя разрешений).


person Thermatix    schedule 20.05.2014    source источник


Ответы (1)


Вы определяете

def self.set_permissions *permissions
  self.perms = permissions
end

который является методом уровня класса, а attr_accessor находится на уровне экземпляра.

Если вы хотите установить разрешения на уровне класса, я предлагаю вам использовать cattr_accessor. Также проверьте его параметры instance_reader и instance_writer.

person mdesantis    schedule 20.05.2014
comment
Что ж, только что попробовал, и это сработало, большое спасибо. - person Thermatix; 20.05.2014