Рельсы: методы из модуля, входящего в состав контроллера, недоступны

Странная вещь - у меня есть модуль проверки подлинности в lib/ следующим образом:

module Authentication
  protected

  def current_user
    User.find(1)
  end

end

и в ApplicationController я включаю этот модуль и все помощники, но метод current_user доступен в контроллерах, но не из представлений:( Как я могу сделать эту работу?

Ответ 1

Если метод был определен непосредственно в контроллере, вы должны сделать его доступным для просмотра, вызвав helper_method :method_name.

class ApplicationController < ActionController::Base

  def current_user
    # ...
  end

  helper_method :current_user
end

С модулем вы можете сделать то же самое, но это немного сложнее.

module Authentication
  def current_user
    # ...
  end

  def self.included m
    return unless m < ActionController::Base
    m.helper_method :current_user # , :any_other_helper_methods
  end
end

class ApplicationController < ActionController::Base
  include Authentication
end

А, да, если ваш модуль должен быть строго вспомогательным модулем, вы можете сделать это, как сказал Лихтамберг. Но опять же вы можете просто назвать его AuthenticationHelper и поместить его в папку app/helpers.

Хотя, по собственному опыту с кодом аутентификации, вы захотите, чтобы он был доступен как для контроллера, так и для представления. Потому что обычно вы будете обрабатывать авторизацию в контроллере. Помощники доступны исключительно для просмотра. (Я считаю, что они первоначально были предназначены для сокращения сложных конструкций html.)