Нужно уточнить, почему методы обертки?Руководство по Ruby on Rails, глава 9, раздел 9.3.3 current-user - - PullRequest
0 голосов
/ 01 февраля 2011

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

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

Ответы [ 3 ]

0 голосов
/ 03 февраля 2011

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

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

0 голосов
/ 12 мая 2012

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

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

0 голосов
/ 01 февраля 2011

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

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

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

...