我正在审查会话,并发现了一个我以前使用过的非常通用的会话控制器:
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 %>
然而,我不明白为什么
current_user
可以像实例变量一样被访问。它不是一个方法吗?为什么我可以将其视为@current_user
并从中提取属性,例如current_user.name
、current_user.age
等等?我认为只有实例变量才能这样做。在第一个和第二个方法的
sign_in(user)
和sign_out
中,self
是指什么?这些被认为是类方法,对吗?
current_user.name
和current_user().name
是相同的可能会有所帮助。这只是 Ruby 的一种惯例,在函数调用中没有参数时省略括号。这与其他语言非常不同,其他语言中没有括号的函数名不会调用该函数,而是引用或指向一个函数(例如在 JavaScript 中,function currentUser(); end; var myFxn = currentUser; var user = myFxn();
)。 - MikeJ