Я использую 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, но должен быть свободен от разрешений, чтобы человек мог получить токен, не требуя разрешений).