Rails 5.2: ActiveRecord :: RecordInvalid (утверждает, что имя пользователя взято, хотя это не так) - PullRequest
0 голосов
/ 24 октября 2018

У меня проблема с моим Rails-API, в частности ActiveRecord утверждает, что - когда бы я ни пытался создать пользователя - пользователь уже существовал.

Это моя текущая настройка: Ruby -v 2.5.1p57 / Rails 5.2 (только API)

Я использую Postman для доставки HTTP-запроса POST к моей конечной точке API, однако я не могу создать пользователей вообще.

Вот как выглядит моя User-Model:

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 голосов
/ 24 октября 2018

Итак, вот решение проблемы, которую я разместил:

  1. , как правильно отметили @Nathan Kontny и @fanta, user_params отсутствовали в методе создания users_controller.rb.

  2. Всякий раз, когда вы пытаетесь отправить запрос HTTP POST с помощью программного обеспечения, такого как «Почтальон» или чего-то подобного, убедитесь, что тип содержимого вашего запроса установлен application / JSON .Это важно.В противном случае ваш запрос будет простым текстом.

В Postman это можно сделать, выбрав его в раскрывающемся меню на вкладке «Тело» редактора запросов.

Приложение типа контента «Почтальон» / JSON

0 голосов
/ 24 октября 2018

Посмотрите на этот запрос:

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

имя пользователя IS NULL

Почему имя пользователя NULL в этом запросе?Это хороший намек на то, что ваше имя пользователя не заполняется.Глядя на свой контроллер, вы обнаружите проблему:

user = User.create!

Вам необходимо передать параметры в метод create.Вот так:

user = User.create!(user_params)

Помогает ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...