Нужно пояснение, почему методы-оболочки? Ruby on Rails Tutorial глава 9 раздел 9.3.3 текущий пользователь -

Я понимаю, что хелперы обычно недоступны в контроллерах. Но зачем все это обертывание вокруг переменной экземпляра @current_user?

Почему помощник имеет «current_user=» и «current_user», определенные как методы? Почему @current_user может быть всем, что нужно для этого раздела?


person mpechner    schedule 01.02.2011    source источник


Ответы (3)


Думаю, вам нужно продолжить чтение. Из текста:

Если бы мы сделали это, то эффективно воспроизвели бы функциональность атрибута attr_accessor, впервые увиденного в разделе 4.4.5 и использовавшегося для создания атрибута виртуального пароля в разделе 7.1.1.8. Проблема в том, что он совершенно не решает нашу проблему: с кодом в В листинге 9.15 статус входа пользователя будет забыт: как только пользователь перейдет на другую страницу — пуф! — сеанс завершится, и пользователь автоматически выйдет из системы.

Чтобы избежать этой проблемы, мы можем найти пользователя сеанса, соответствующего куки...

person cam    schedule 01.02.2011

У меня такой же вопрос. Да, я думаю, что current_user устроен таким образом, чтобы предотвратить дублирование кода. Но я также думаю, что это может быть проблема синтаксиса. Если бы вы сделали current_user общедоступным свойством SessionHelper, (я думаю) вы бы получили к нему доступ с помощью SessionHelper.current_user, но если вы определите метод current_user и метод current_user=(user), вы можете использовать свойство current_user без лишних помех.

Так что, я думаю, это просто проблема стиля. Ваш подход тоже работает.

person Terrabits    schedule 12.05.2012
comment
Спасибо за выделение кода @Mab879. Все еще разбираюсь с сайтом. - person Terrabits; 15.02.2013

Я получил хороший ответ от коллеги.

module SessionsHelper

  def sign_in(user)
    cookies.permanent.signed[:remember_token] = [user.id, user.salt]
    self.current_user = user   
  end 
end

def current_user
    @current_user ||= user_from_remember_token
end

Это проблема рефакторинга. Вы не хотите везде копировать код текущего пользователя.

Я все еще думаю, что метод current_user= не нужен. Я не вижу причин не использовать переменную экземпляра для присваивания.

person mpechner    schedule 03.02.2011