在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
答案 0 :(得分:1)
当然你可以这样做。但想法是封装实例变量,而不是直接在getter和setter方法之外分配它,这就是ruby的工作方式。你实际上不能做SomeObject。@ instanceVar =。你需要制定者。
因此,如果将来你需要设置current_user eather,你必须使用sign_in方法或创建一个类似于setter的新方法。那么为什么不使用呢?