我的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):
最后一个字符串翻译为:验证失败:用户名已被使用,密码不能为空。
任何提示都非常感谢!
答案 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)
这是我发布的问题的解决方案:
@Nathan Kontny和@fanta正确指出,users_controller.rb的create方法中缺少user_params。
每当您尝试使用“邮递员”之类的软件发送HTTP POST请求时,请确保您的请求内容类型设置为 application / JSON 。这个很重要。否则,您的请求将只是纯文本。
在Postman中,可以通过从请求编辑器的“正文”选项卡中的下拉列表中选择它来实现。