Rails教程Michael hartl。第8章sign_in方法,为什么我们使用了writer方法?

时间:2013-06-06 03:04:49

标签: ruby-on-rails ruby-on-rails-3

在Michael Hartls rails教程中,我遇到了以下代码:

module SessionsHelper 
def current_user=(user)
  @current_user = user
 end

 def current_user  #get logged in user
  @current_user||=User.find_by_remember_token(:remember_token)
 end

 def sign_in(user)   #sign the user in by setting cookies
  cookies.permanent[:remember_token]= user.remember_token
  current_user = user
 end

 def signed_in?(user)   #check whether user signed in
  !current_user.nil?
 end

end

我的SessionsController创建操作如下所示:

def create
 user = User.find_by_email(params[:session][:email])
 if user && user.authenticate(params[:session][:password])
  sign_in user   # sign the user in by setting cookies
 else
  flash.now[:error]= "Invalid email/password"
  render 'new'
 end
end

为什么我们在SessionsHelper模块中需要一个编写器方法

def current_user=(user)

我们不能直接在

sign_in
方法中将用户的值分配给@current_user变量吗? 可以这样做:

module SessionsHelper 

 # Notice that there is no def current_user=(user) method.

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

 def sign_in(user)
  cookies.permanent[:remember_token]= user.remember_token
  @current_user = user   #set the current user directly withoout a writer method
 end

 def signed_in?(user)
  !current_user.nil?
 end

end

1 个答案:

答案 0 :(得分:1)

当然你可以这样做。但想法是封装实例变量,而不是直接在getter和setter方法之外分配它,这就是ruby的工作方式。你实际上不能做SomeObject。@ instanceVar =。你需要制定者。

因此,如果将来你需要设置current_user eather,你必须使用sign_in方法或创建一个类似于setter的新方法。那么为什么不使用呢?