NoMethodError(nil:NilClass的未定义方法“错误”):

时间:2018-09-23 22:46:43

标签: ruby-on-rails api

我们收到上述错误,但不确定为什么。我们正在为测验网站构建API,这是我们的logins_controller:

 class Api::LoginsController < ApplicationController

    skip_before_action :verify_authentication

    def create
        user = User.find_by_username(params[:username])
        if  user && user.authenticate(params[:password])
            render json: { name: user.name, token: user.token }
        else
            render json: user.errors
        end
    end
 end

我们的架构:

create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "username"
    t.string "password_digest"
    t.string "token"
    t.boolean "admin"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["token"], name: "index_users_on_token", unique: true
  end

终端中的错误消息:

Started POST "/api/logins" for 127.0.0.1 at 2018-09-23 18:30:48 -0400
Processing by Api::LoginsController#create as */*
  Parameters: {"login"=>{}}
  User Load (4.2ms)  SELECT  "users".* FROM "users" WHERE "users"."username" IS NULL LIMIT $1  [["LIMIT", 1]]
  ↳ app/controllers/api/logins_controller.rb:6
Completed 500 Internal Server Error in 8ms (ActiveRecord: 4.2ms)



NoMethodError (undefined method `errors' for nil:NilClass):

app/controllers/api/logins_controller.rb:10:in `create'

这一切正常,然后突然说用户为零?我们是否没有在create下定义它。

4 个答案:

答案 0 :(得分:1)

如果参数:username与任何用户都不匹配,则user变量将为nil

答案 1 :(得分:0)

您没有向控制器发送任何参数

在您的终端中:Parameters: {"login"=>{}}

user = User.find_by_username(params[:username]) 

因此user变量将为nil

答案 2 :(得分:0)

如果您的数据库中不存在具有用户名的用户,则以下代码将返回nil

user = User.find_by_username(params[:username])

因此,您在致电undefined method errors时会得到user.errors

答案 3 :(得分:0)

仔细检查了一些代码,并没有做太多改变,但是只要在任何地方将用户更改为@user,它似乎都能正常工作!