我正在尝试为我的应用程序构建一个非常简单的用户身份验证。我认为问题是'login'表单没有指向:user数据库。当我创建一个新用户时,我将其设置为自动登录。该函数效果很好,但是当我在登录表单中登录同一个用户时,它返回错误“username is NULL LIMIT 1.我使用的是Rails 4.2.5。当我进入rails控制台时,我可以看到用户仍然存在。
我为可怕的编码习惯提前道歉,我主要是在教自己。提前感谢您的帮助。
会话控制器:
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_username(params[:username])
if user && user.authenticate(params[:username][:password])
session[:user_id] = user.id
redirect_to root_path, notice: "You are now logged in."
else
redirect_to '/login', notice: "incorrect email or password! "
end
end
def destroy
session[:user_id] = nil
redirect_to root_path, notice: "logged out."
end
end
用户模型
class User < ActiveRecord::Base
has_secure_password
validates_uniqueness_of :username, :email
validates :password, length: {minimum: 6}, allow_blank: true
has_many :messages
end
登录表格
<div class="login">
<%= simple_form_for :sessions do |f| %>
<%= f.input :username %>
<%= f.input :password %>
<%= f.button :submit, "Login" %>
<% end %>
</div>
当我尝试登录时,终端返回:
在2016-06-02 00:02:15 -0400开始了127.0.0.1的POST“/ login” 由SessionsController处理#create as HTML 参数:{“utf8”=&gt;“✓”,“authenticity_token”=&gt;“WNJziVL / xhAeGdsjNANi6LWlDrAMIGKm2kDWmsVLfxMh6fCwG1LoRWG09wgsn2z3rIZkreODkHZ0GJeYFCW3yQ ==”,“sessions”=&gt; {“username”=&gt;“crackerjack540”,“password”=&gt; “[FILTERED]”},“commit”=&gt;“登录”} 用户负载(0.2ms)SELECT“users”。* FROM“users”WHERE“users”。“username”IS NULL LIMIT 1 重定向到http://localhost:3000/login 完成302发现在2ms(ActiveRecord:0.2ms)
答案 0 :(得分:1)
用户名在会话对象中,因此不是:
user = User.find_by_username(params[:username])
你应该这样做:
user = User.find_by_username(params[:sessions][:username])
另外,下面,访问密码:
user.authenticate(params[:sessions][:password])
希望这有帮助!