неоднозначный вопрос, так что это всего лишь предположение:
На первый взгляд кажется, что require_role - это оболочка для before_filter. Поэтому я собираюсь основать свой ответ на этом наблюдении.
before_filter - это метод класса контроллера. В отличие от check_if_role_required, который выглядит как метод экземпляра контроллера. Поскольку require_role кажется оберткой для before_filter, я собираюсь предположить, что это также метод класса.
Когда вы вызываете пустой метод (не вызываемый объектом), Ruby неявно определяет вызывающий объект как собственный. Он является определяющим классом для вызовов методов, появляющихся вне методов, или объектом, вызывающим текущий метод для вызовов методов внутри других методов. В случае методов класса self является текущим классом. Когда дело доходит до before_filter, ожидается, что он будет вызван классом ActionController :: Base. Вызывая его внутри метода экземпляра, такого как check_if_role_required, self оценивает экземпляр ActionController :: Base, который не имеет before_filter или, возможно, даже требует require_role.
Код всегда помогает цементировать примеры:
Этот простой класс помогает проиллюстрировать мою точку зрения.
class Example
# class method like required_role or before_filter
def self.c_method
# calls self.class
# self is the class Example
class
end
c_method # valid statement
#instance method like check_if_role_required
def i_method
#calls self.class
# self is an instance of the Example class.
class
end
# invalid statement
# i.method
def missing_method_example
# raises error.
# calls self.c_method, but self is the instance.
# c_method is not defined for instances of Example
c_method
end
end
Example.c_method # => "Class"
@example = Example.new
@example.i_method # => "Example"
@example.missing_method_example # => Unknown Method Error