Зачем нужен метод присваивания, если можно просто использовать = (из учебника Хартла)?

Мне ужасно трудно понять, какая функция назначения необходима, как описано в глава 8.2.3. учебника Хартла.

В качестве контекста он сосредоточился на второй строке следующей функции sign_in:

  def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user #<-- this line
  end

Там, где он упоминает, что это назначение, оно должно быть определено отдельно как

def current_user=(user)
    @current_user = user
end

Где метод current_user= специально разработан для обработки назначения current_user. Мои заблуждения:

  1. Зачем это вообще нужно? Я думал, что простой = позволит вам назначать вещи. Например user.email = [email protected]

  2. Кроме того, когда в конце концов он будет кодировать redirect_to current_user, как то, что принадлежит SessionsController, будет преобразовано в представление, контролируемое UsersController?

Спасибо!!


person daspianist    schedule 19.12.2012    source источник


Ответы (1)


Причина в том, что это необходимо, чтобы избежать путаницы (для интерпретатора/VM) между вызовом метода и назначением переменной.

def foo
  # Two completely different things!
  bar = "baz" # assigns baz to local variable bar
  self.bar = "baz" # invokes the bar= method with parameter of baz
end

Что происходит там, так это то, что он делает две вещи, во-первых, вызывает метод current_user= с объектом пользователя, а во-вторых, устанавливает для него значение @current_user (это не очень хороший пример - вы, вероятно, сделали бы намного больше в реальной жизни, если бы вы чтобы сделать метод current_user=, такой как настройка переменных сеанса).

во-вторых, redirect_to current_user эквивалентно redirect_to user_path(current_user) — проверьте http://api.rubyonrails.org/classes/ActionController/Redirecting.html для получения более подробной информации, объясняющей различные типы параметров, которые может принимать redirect_to. Обратите внимание, что это перенаправление, а не рендеринг, поэтому здесь происходит второй HTTP-запрос.

person Omar Qureshi    schedule 19.12.2012