self.method在方法中调用

时间:2011-06-01 15:09:31

标签: ruby-on-rails methods

我是铁轨新手上的红宝石。下面是用户登录后记住会话的代码登录的一部分。我从ruby on rails教程获得此代码并尝试学习。在sign_in方法中我们定义

self.current_user=user 

之后我们有两种不同的current_user方法。如果我删除第一个,则会显示错误消息。

如果我们使用像self.current_user=user?

这样的表达式,为什么我们需要定义诸如(def current_user =)之类的方法

为什么有必要这样做?我不明白为什么我们再次定义另一个current_user方法。我们只是把它放到第一个?请看下面。非常感谢。

def sign_in(user)
  cookies.permanent.signed[:remember_token] = [user.id, user.salt]
  self.current_user = user
end
def current_user=(user)
  @current_user=user
end
def current_user
  @current_user ||= user_from_remember_token
end

完整代码:

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

def current_user=(user)
  @current_user = user
end
def current_user
  @current_user ||= user_from_remember_token
end

private

def user_from_remember_token
  User.authenticate_with_salt(*remember_token)
end

def remember_token
  cookies.signed[:remember_token] || [nil, nil]
end

2 个答案:

答案 0 :(得分:2)

current_user定义的方法是setter / getter方法。

#setter
def current_user=(user)
  @current_user=user
end

#getter
def current_user
  @current_user ||= user_from_remember_token
end

请注意,对于setter方法,名称以=符号结尾。

sign_in方法中执行self.curcrent_user = user实际调用setter时,不会访问实例变量current_user。访问它将是@current_user=user。这就是删除它时收到错误的原因。

通常你需要setter / getters才能从课堂外设置和获取东西。例如,如果您希望稍后检索当前用户,则可以在类的实例上调用current_user

虽然我必须承认,在这种情况下,我没有太多意义建立公共二传手。通常您需要sign_insign_off方法,而不是明确的current_user=

答案 1 :(得分:1)

两个current_user方法实际上是两种不同的方法,一种用于设置current_user变量,另一种用于再次获取它,实际上使用的是一种称为memoization的模式(更多内容见下文)。

current_user=(user)方法设置一个实例变量(以@开头的ruby变量中的各种级别的变量范围都是一个实例 - 有关更多信息,请参阅this page)。 def current_user然后返回相同变量的内容*。

*除非未设置@current_user变量。这是@current_user ||= user_from_remember_token行的目的。这有效地说是'返回@current_user变量的内容,除非它没有被设置,在这种情况下返回运行方法user_from_remember_token 的结果以及设置@current_user变量同样的'。这是一种称为memoization的技术(阅读here为什么这是一件好事)