ruby-on-rails - 尝试在 Rails 中登录时如何修复 NoMethodError
问题描述
我在我正在构建的一个简单的 Rails 应用程序中设置了一个身份验证系统。用户注册工作正常,但是,尝试登录会导致我似乎无法修复的无方法错误。我的设置如下:
会话控制器:
class SessionsController < ApplicationController
def new; end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(password: params[:session][:password])
log_in user
redirect_to user
else
flash[:danger] = 'Invalid email/password entered'
render 'new'
end
end
def destroy
log_out if logged_in?
redirect_to root_url
end
end
会话助手:
module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
@current_user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
def logged_in?
!current_user.nil?
end
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
end
以下是错误:
Started POST "/login" for ::1 at 2020-05-17 12:44:17 -0400
Processing by SessionsController#create as JS
Parameters: {"authenticity_token"=>"[AUTH CONTENT]", "first_name"=>"[SAMPLE]", "last_name"=>"[SAMPLE]", "email"=>"one@example.com", "password_digest"=>"[FILTERED]", "commit"=>"Log in"}
Completed 500 Internal Server Error in 2ms (ActiveRecord: 0.0ms | Allocations: 1031)
NoMethodError (undefined method `[]' for nil:NilClass):
app/controllers/sessions_controller.rb:5:in `create'
任何帮助表示赞赏。
解决方案
您正在 key:email
的哈希中寻找密钥:session
,但您的请求中没有这样的参数。修复或更改
user = User.find_by(email: params[:session][:email].downcase)
进入
user = User.find_by(email: params[:email].downcase)
此外,密码也是如此。请注意,您正在通过:password_digest
,而不是:password
推荐阅读
- javascript - 有没有办法将从上一步中的 GET 返回的数组传递给 Zapier 中的代码操作步骤?
- hadoop - 如何在 Hadoop 中使用自定义类型
- python - VS Code 自动格式化 Python 代码以使用 2 个选项卡
- c# - 以编程方式将应用程序池标识设置为域用户
- javascript - 跨平台 ESLint 命令以递归方式在当前目录上运行?
- blazor - Blazor 服务器端 Console.WriteLine 不起作用
- usb - 升级(发现)stm32固件的编程方式是什么?(替换 ST loader 工具)
- css - 样式化输入[type="range"]
- jquery - 只允许在日期选择器上添加 2 天,但不包括周六和周日
- c++ - 自动生成 cmake 到 .vcxproj 文件