Ruby on Rails 3:Setters和Getters以及控制器方法中的self

Fil*_*pos 4 self getter-setter ruby-on-rails-3

我对Rails 3应用程序控制器或帮助程序中的setter和getter的可用性有点困惑.为什么有人会在控制器方法(或模块)中使用setter和getter而不仅仅是实例变量.有人能举个例子吗?使用制定者和吸气剂是明智的吗?什么时候需要?

例如,Michael Hartl的Rubby on Rails 3 Tutorial,它说(第347页):

模块SessionsHelper

def current_user=(user)
 @current_user = user
end

def current_user
 @current_user ||= user_from_remember_token
end
Run Code Online (Sandbox Code Playgroud)

为什么不@current_user首先使用.

我的第二个问题是在控制器方法中self的含义是什么.例如:

Class SessionsController < ApplicationController

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

end
Run Code Online (Sandbox Code Playgroud)

我知道User模型类中的self指的是用户本身但是当它在控制器内时它指的是什么?任何例子?

谢谢

Jer*_*man 5

在控制器内部,self指控制器本身.所以,当你说self.current_user = user,你正在调用current_user=控制器(如SessionsHelper模块中所定义的那样,我假设它正确包含在内).

由于一些原因,这种技术有点清洁.

  1. 它允许您在读取或分配当前用户时添加其他逻辑,如果您需要在以后执行此操作.直接使用实例变量不提供这样的扩展点.
  2. 它允许在user_from_remember_token第一次current_user调用时计算结果,但是@current_user否则返回实例变量的缓存结果.
  3. 可能希望current_user在控制器上从某个其他对象调用.访问另一个对象上的实例变量很尴尬,因为这应该是内部状态(打算通过上面的方法current_usercurrent_user=方法修改).