2012-11-19 2 views
3

Я в настоящее время рассматривает сессии, и я наткнулся на довольно общий контроллер сессий я использовал раньше:Rails: current_user и сеансы осветление

module SessionsHelper 

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

def sign_out 
    self.current_user = nil 
    cookies[:remember_token] = nil 
end 

def signed_in? 
    !current_user.nil? 
end 

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

def current_user=(user) 
    @current_user = user 
end 


end 

И я понял, что я использовал CURRENT_USER во взглядах много раз. например:

<% if current_user == @user %> 
    <%= current_user.name %> 
<% else %> 
    This user is not you. 
<% end %> 
  1. Однако, я не понимаю, почему current_user доступен как будто это переменная экземпляра. Разве это не метод? Почему я могу лечить его так же, как @current_user и вытаскивать из него атрибуты, как current_user.name, current_user.age и т. Д.? Я думал, что это возможно только для переменных.

  2. В первом и втором методах sign_in(user) и sign_out, что делает self обратитесь к? Они считаются методами класса?

+1

Это может помочь новичкам понять, что 'current_user.name' совпадает с' current_user(). Name'. Это просто соглашение Ruby, чтобы вырезать круглые скобки из вызова функции, когда нет параметров. Это сильно отличается от других языков, где имя функции без круглых скобок не вызывает функцию, но вместо этого является ссылкой или указателем на функцию (например, в JavaScript, 'function currentUser(); end; var myFxn = currentUser; var user = myFxn(); '). – MikeJ

ответ

4
  1. current_user действительно метод, определенный в SessionHelper, что просто случается возвращать ссылку на его внутренний переменный экземпляр @current_user. Такой метод обычно называют «читателем». Поскольку возвращенное значение является ссылкой на @current_user, вы можете использовать это значение, как если бы это были фактической переменная экземпляра, поэтому current_user.name

  2. Использование self необходимо в определении этих двух методов, потому что без него, рубина будет предположим, что вы хотите назначить новую локальную переменную с именем current_user внутри метода вместо вызова метода current_user=(), уже определенного внутри модуля. В этом случае self относится к самому модулю.

+0

отличные объяснения. спасибо, cdes – Edmund

Смежные вопросы