首页 > 解决方案 > 尝试在 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'

任何帮助表示赞赏。

标签: ruby-on-railsruby

解决方案


您正在 key:email的哈希中寻找密钥:session,但您的请求中没有这样的参数。修复或更改

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

进入

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

此外,密码也是如此。请注意,您正在通过:password_digest,而不是:password


推荐阅读