Учебное пособие по Ruby on Rails от Майкла Хартла, глава 8, раздел «Текущий пользователь»

Я новичок в Rails и просматриваю Учебник по Rails от Майкла Хартла. До этого момента я мог понять все в учебнике, но теперь я думаю, что застрял на полпути к главе 8. Я хотел бы получить подтверждение от более опытных программистов Rails, что я правильно следую объяснению автора. . Я имею в виду конкретно главу 8, раздел 8.2.3 ниже:

В разделе 8.2.3 метод «sign_in» имеет строку:

self.current_user = user

Таким образом, используя «self» вместо «current_user», current_user стал частью сеанса, но еще не сохранен в базе данных, верно?

В этом случае методы, перечисленные в листинге 8.22 методы геттера и сеттера, верно? Первый для сохранения current_user в БД, а второй для его извлечения по мере необходимости?

И, наконец, методы получения и установки необходимы, потому что это плохая практика — выставлять переменную экземпляра в методе (в данном случае «sign_in»)? Другими словами, было бы плохо заменить:

self.current_user = user

с участием

@current_user = user

в методе "sign_in"?

Я ценю любую помощь и совет. Спасибо.


person user2360062    schedule 07.05.2013    source источник


Ответы (1)


Я не очень хорошо разбираюсь в Rails, но вот мое непрофессиональное понимание методов в SessionsHelper.

Во-первых, @current_user является переменной экземпляра модуля SessionsHelper. Это означает, что он сохраняется для последующих вызовов методов в SessionsHelper.


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

То есть, используя "self" вместо "current_user", current_user становится частью сеанса, но еще не сохраняется в базе данных, верно?

self.current_user = user не делает 'current_user' частью чего-либо.
self ссылается на себя, SessionsHelper.
self.current_user = фактически вызывает свой собственный метод, метод установки, def current_user=(user).


Если это так, то методы, перечисленные в листинге 8.22, являются методами получения и установки, правильно?

да.

  def current_user=(user) # Setter.
    @current_user = user
  end

Первый, кто сохранил current_user в БД,

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


  def current_user # Getter.
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

и второй, чтобы получить его по мере необходимости?

Второй метод, current_user, возвращает существующее значение @current_user.
Если @current_user равно nil(null), выполняется

||= User.find_by_remember_token(cookies[:remember_token])

который извлекает и устанавливает @current_user в качестве User из базы данных на основе файла cookie браузера remember_token.


И, наконец, методы getter и setter необходимы, потому что не рекомендуется предоставлять переменную экземпляра в методе (в данном случае "sign_in")?

На мой взгляд, методы геттера и сеттера точно не нужны. Можно просто использовать @current_user во всем помощнике.
Однако Devise ( популярный гем аутентификации пользователей) использует метод current_user в своих помощниках. Этот комментарий актуален также.


Другими словами, было бы неправильно заменить: self.current_user = user на @current_user = user в методе "sign_in"?

Не должно быть ничего плохого в том, чтобы заменить его на @current_user = user. Этот вопрос (та же ссылка, что и связанный комментарий выше) показывает, что функциональность идентична в случае учебника.

person Sun    schedule 09.05.2013