Простой рубин, если метод не ошибка, ROR - PullRequest
0 голосов
/ 12 февраля 2010

Предположим, что require_role ["alt", "student worker"], :except => [:list, :show, :index, :create] работает вне этого метода, что я здесь не так делаю? Когда я вызываю метод, он работает, пока он промо-сайт? (true), но когда оно ложно, метод завершается ошибкой.

def check_if_role_is_required
    require_role ["alt", "student worker"], :except => [:list, :show, :index, :create] unless promo_site?
  end

Ответы [ 2 ]

1 голос
/ 12 февраля 2010

неоднозначный вопрос, так что это всего лишь предположение:

На первый взгляд кажется, что 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
0 голосов
/ 13 февраля 2010

Попробуйте заключить параметры в круглые скобки:

require_role(["alt", "student worker"], :except => [:list, :show, :index, :create]) unless promo_site?

Это часто исправляет такие проблемы, когда используются хеши ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...