从数据库获取用户时,在rails中区分用户和用户

时间:2016-11-14 04:03:39

标签: ruby-on-rails ruby ruby-on-rails-5

这是我的会话控制器。我改变了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

1 个答案:

答案 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个变量:UseruserUSER,则它们都是不同的。 Ruby可以区分这三者,就像你的方法一样。