Ruby on Rails 3: сеттеры и геттеры и self в методе контроллера - PullRequest
4 голосов
/ 01 августа 2011

Я немного сбит с толку из-за удобства использования сеттеров и геттеров внутри прикладного контроллера или помощника Rails 3. Зачем кому-то использовать методы установки и получения в методе контроллера (или модуле), а не просто в переменной экземпляра. Может кто-нибудь привести пример? Разумно ли использовать сеттеры и геттеры? И когда это требуется?

Например, в руководстве по Rubby on Rails 3 Майкла Хартла (стр. 347) говорится:

Модуль SessionsHelper

def current_user=(user)
 @current_user = user
end

def current_user
 @current_user ||= user_from_remember_token
end

Почему бы просто не использовать @current_user во-первых.

Мой второй вопрос - что означает «я» внутри метода контроллера. Например:

Class SessionsController < ApplicationController

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

end

Я знаю, что self внутри класса User Model относится к самому пользователю. Но когда он находится внутри контроллера, к чему он относится? Любой пример?

Спасибо

1 Ответ

5 голосов
/ 01 августа 2011

Внутри контроллера self относится к самому контроллеру. Поэтому, когда вы говорите self.current_user = user, вы вызываете current_user= на контроллере (как определено в модуле SessionsHelper, который, я полагаю, правильно включен).

Эта техника несколько чище по нескольким причинам.

  1. Позволяет добавить дополнительную логику, когда текущий пользователь прочитан или назначен, если вам нужно сделать это позднее. Непосредственное использование переменной экземпляра не дает такой точки расширения.
  2. Это позволяет вычислять результат user_from_remember_token при первом вызове current_user, но в противном случае возвращается кэшированный результат из переменной экземпляра @current_user.
  3. Может быть желательно, чтобы current_user вызывался на контроллере из какого-либо другого объекта. Доступ к переменным экземпляра в другом объекте неудобен, поскольку предполагается, что это внутреннее состояние (которое предназначено для изменения с помощью методов, таких как current_user и current_user= методы выше).
...