这是我的会话控制器。我改变了this question中的一行代码,我只是有点不确定为什么它是这样的。
我已经研究了类的定义并做了很多研究,试图找出为什么unless user.present?
不是资本U.例如unless User.present?
如果是User类,那么它应该是在User.find_by
中在数据库中搜索的用户。
rails首先会查看将User作为用户读取的数据库,小写。
我这样说是因为它之前的代码行也使用user = User.from_omniauth(env["omniauth.auth"])
而User也是大写的,那么rails如何区分同时属于User类的代码?
def create
user = User.from_omniauth(env["omniauth.auth"])
unless user.present?
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
redirect_to user_url(user)
# Log the user in and redirect to the user's show page.
else
# Create an error message.
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
else
log_in user
redirect_to user_url(user)
end
end
答案 0 :(得分:1)
当你写:
user = User.from_omniauth(env["omniauth.auth"])
您正在定义一个变量user
,稍后将在您的控制器中使用。
所以,当你写下:
unless user.present?
你真的在写:
unless User.from_omniauth(env["omniauth.auth"]).present?
行User.from_omniauth(env["omniauth.auth"])
从数据库中获取用户,将其存储在user
变量中,并检查用户是否存在
此外,在您的unless
语句中,您定义的是user
变量,因此可以使用与第2行中原始user
变量不同的方式使用该变量
ruby(和大多数语言)中的大写将意味着不同的东西。例如,如果您有3个变量:User
,user
和USER
,则它们都是不同的。 Ruby可以区分这三者,就像你的方法一样。