Rails:SELECT语句中的未知列

时间:2016-03-15 22:19:01

标签: mysql sql ruby-on-rails ruby-on-rails-4 activerecord

我试图在Rails应用上验证用户登录。控制器代码如下所示:

def create
  user = User.where(params[:session][:email]).first
  # user = User.where(:type=> 'User', :email => params[:session][:email])
  debugger
  if user and user.authenticate(params[:session][:password])
    session[:user_id] = user.id
    redirect_to admin_url
  else
    redirect_to login_url, alert: "Invalid user/password combination"
  end
end

正确传递了参数,但它正在尝试搜索“用户”#39; users表中的属性。没有用户attr。 users表如下所示:

mysql> DESCRIBE users;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| userid     | int(11)      | YES  |     | NULL    |                |
| email      | varchar(255) | YES  |     | NULL    |                |
| password   | varchar(255) | YES  |     | NULL    |                |
| fname      | varchar(255) | YES  |     | NULL    |                |
| lname      | varchar(255) | YES  |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

2 个答案:

答案 0 :(得分:0)

在您的情况下,ActiveRecord会生成一个查询,其中params[:session][:email]是列名:

SELECT `users`.* FROM `users` WHERE (`<the value of params[:session][:email]>`)

您应该在where中提供列名:

user = User.where(email: params[:session][:email]).first

或者只使用find_by代替where + first

user = User.find_by(email: params[:session][:email])

答案 1 :(得分:-1)

这一行有一个问题

user = User.where(params[:session][:email]).first

您希望通过他的电子邮件地址搜索用户,因此您必须指定(告诉我要搜索该特定字段的活动记录),如此

user = User.where(email: params[:session][:email]).first