ruby-on-rails - 从数据库获取用户时区分 User 和 rails 中的用户

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

这是我的 session Controller 。我在this question中改了一行代码我只是有点不确定为什么会这样。

我研究了类的定义并做了很多研究,试图找出为什么 unless user.present? 不是大写 U。例如 unless User.present?

如果它属于 User 类,那么它应该是要在数据库中搜索的 User,就像 User.find_by 一样。

rails 是否首先查看读取用户为用户的数据库,小写。

我这样说是因为它前面的代码行也使用 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

最佳答案

当你写的时候:

user = User.from_omniauth(env["omniauth.auth"])

您正在定义一个变量 user,稍后将在您的 Controller 中使用。

所以,当你写:

unless user.present?

你真的在写:

unless User.from_omniauth(env["omniauth.auth"]).present?

User.from_omniauth(env["omniauth.auth"]) 行从数据库中获取用户,将其存储在 user 变量中,并检查是否一个用户在场

此外,在您的 unless 语句中,您定义了一个 user 变量,因此它可以以不同于原始 user 的方式使用第 2 行的变量

在 ruby​​(和大多数语言)中大写表示不同的意思。例如,如果您有 3 个变量:UseruserUSER,它们都是不同的。 Ruby 可以区分这三者,就像在您的方法中一样。

关于ruby-on-rails - 从数据库获取用户时区分 User 和 rails 中的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40581721/

相关文章:

jquery - 如何在 Rails 上启用 Turbolinks 的情况下通过 AJAX 正确渲染部分内容?

ruby-on-rails - Rails 5 Rspec 接收 ActionController::Params

ruby-on-rails - 除了这个 Ruby 惯用语之外,还有更好的选择吗?

ruby-on-rails - 是否有必要添加缺失的结束标记作为清理 HTML 以防止 XSS 攻击的一部分?

ruby-on-rails - 使用 PDF 套件时出错

ruby-on-rails - phusion passenger 和 ruby​​ 1.9.1 已经开始工作了吗?

ruby-on-rails - 在 Ruby on Rails 应用程序中使用客户端 SSL

ruby - 在 Ruby 的 GTK/Glade 中检测修改键(例如 Ctrl-P)的简单方法?

ruby - string.next 的反义词是什么?

javascript - Rails - 如何在发出请求之前修改 http 参数?