Rails: 当前用户和会话澄清

3

我正在审查会话,并发现了一个我以前使用过的非常通用的会话控制器:

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.namecurrent_user.age等等?我认为只有实例变量才能这样做。

  2. 在第一个和第二个方法的sign_in(user)sign_out中,self是指什么?这些被认为是类方法,对吗?


1
对于初学者来说,意识到 current_user.namecurrent_user().name 是相同的可能会有所帮助。这只是 Ruby 的一种惯例,在函数调用中没有参数时省略括号。这与其他语言非常不同,其他语言中没有括号的函数名不会调用该函数,而是引用或指向一个函数(例如在 JavaScript 中,function currentUser(); end; var myFxn = currentUser; var user = myFxn();)。 - MikeJ
1个回答

4
  1. current_user 是定义在 SessionHelper 中的一个方法,它恰好返回对其内部实例变量 @current_user 的引用。这样的方法通常被称为 "reader"。由于返回值是对 @current_user 的引用,因此您可以将该值用作实际实例变量,因此使用current_user.name

  2. 在这两个方法的定义中,使用 self 是必要的,因为如果没有它,Ruby 将假定您想在方法内部分配给一个名为 current_user 的新本地变量,而不是调用模块中已定义的方法 current_user=()。在这种情况下,self 指的是模块本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接