Rails 5.2:ActiveRecord :: RecordInvalid(声称用户名已被使用,尽管不是)

时间:2018-10-24 18:03:51

标签: ruby-on-rails api authentication ruby-on-rails-5

我的Rails-API出现问题,特别是ActiveRecord声称-每当我尝试创建用户时-该用户已经存在。

这是我当前的设置: Ruby -v 2.5.1p57 / Rails 5.2(仅API)

我正在使用Postman向我的API端点传递HTTP POST请求,但是我似乎无法创建任何用户。

这是我的用户模型的样子:

class User < ApplicationRecord
  validates_uniqueness_of :username
  has_secure_password
  has_secure_token :auth_token

  def invalidate_token
    self.update_columns(auth_token: nil)
  end

  def self.validate_login(username, password)
    user = find_by(username: username)
    if user && user.authenticate(password)
      user
    end
  end
end

我很清楚,我在这里验证了用户名的唯一性,但令我惊讶的是,对于我在邮递员中测试的用户名,不存在单个DB记录。

接下来是我当前的UsersController版本:

module Api::V1
  class UsersController < ApiController
    before_action :require_login, except: [:create]

    # GET /users
    # GET /users.json
     def index
      @users = User.all
      render json: @users
    end

    # GET /users/1
    # GET /users/1.json
    # def show
    # end

    def profile
      user = User.find_by_auth_token!(request.headers[:token])

      render json: { user: { username: user.username, email: user.email, first_name: user.first_name } }
    end

    # GET /users/new
    def new
      @user = User.new
    end

    # GET /users/1/edit
    def edit
    end

    # POST /users
    # POST /users.json
    def create
      user = User.create!

      render json: { token: user.auth_token }
    end

    # PATCH/PUT /users/1
    # PATCH/PUT /users/1.json
    def update
      respond_to do |format|
        if @user.update(user_params)
          format.html { redirect_to @user, notice: 'Nutzer wurde erfolgreich bearbeitet.' }
        format.json { render :show, status: :ok, location: @user }
        else
          format.html { render :edit }
          format.json { render json: @user.errors, status: :unprocessable_entity }
        end
      end
    end

    # DELETE /users/1
    # DELETE /users/1.json
    def destroy
      @user.destroy
      respond_to do |format|
        format.html { redirect_to users_url, notice: 'Nutzer wurde gelöscht.' }
        format.json { head :no_content }
      end
    end

    private

    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:username, :first_name, :last_name, :email, :password)
    end
  end
end

这是我的Rails终端在尝试POST到端点时的响应:

Processing by Api::V1::UsersController#create as JSON
   (0.1ms)  BEGIN
  ↳ app/controllers/api/v1/users_controller.rb:35
  User Exists (5.0ms)  SELECT  1 AS one FROM "users" WHERE 
"users"."username" IS NULL LIMIT $1  [["LIMIT", 1]]
  ↳ app/controllers/api/v1/users_controller.rb:35
   (0.2ms)  ROLLBACK
  ↳ app/controllers/api/v1/users_controller.rb:35
Completed 422 Unprocessable Entity in 9ms (ActiveRecord: 5.3ms)



ActiveRecord::RecordInvalid (Gültigkeitsprüfung ist fehlgeschlagen: Username ist bereits vergeben, Password muss ausgefüllt werden):

最后一个字符串翻译为:验证失败:用户名已被使用,密码不能为空。

任何提示都非常感谢!

2 个答案:

答案 0 :(得分:3)

看看该查询:

User Exists (5.0ms)  SELECT  1 AS one FROM "users" WHERE 
"users"."username" IS NULL LIMIT $1  [["LIMIT", 1]]

用户名为NULL

为什么此查询中的用户名为NULL?这很好地暗示了您的用户名没有被填充。查看您的控制器,您会发现问题所在:

user = User.create!

您需要将参数传递给create方法。因此:

user = User.create!(user_params)

有帮助吗?

答案 1 :(得分:0)

这是我发布的问题的解决方案:

  1. @Nathan Kontny和@fanta正确指出,users_controller.rb的create方法中缺少user_params。

  2. 每当您尝试使用“邮递员”之类的软件发送HTTP POST请求时,请确保您的请求内容类型设置为 application / JSON 。这个很重要。否则,您的请求将只是纯文本。

在Postman中,可以通过从请求编辑器的“正文”选项卡中的下拉列表中选择它来实现。

Postman content-type application/JSON