我正在使用Rails构建我的第一个REST API,并且有一个我无法解决的简单问题。
基本上我无法从http PUSH
请求中将params哈希写入数据库。
我在Api命名空间下面有以下用户控制器和create action。
class Api::UserController < ApplicationController
http_basic_authenticate_with :name => "test", :password => "test"
skip_before_action :verify_authenticity_token
def create
@user = User.create(params[:user])
respond_to do |format|
if @user.save
format.json{render json: @user, status: :created, location: @user} #render create full response
else
format.json{render json: @user.errors, status: :unprocessable_entity}
end
end
end
end
此操作的路径是
POST /api/user(.:format) api/user#create{:format=>"json"}
用户模型的名称和地址字符串未包含。
要测试REST调用,请设置firefox插件RESTeasy
和RESTclient
使用此网址http://localhost:3000/api/user/
和这个身体 { “名字”:“timoteo”, “地址”:“柏林” }
到目前为止一切顺利。现在发送这个包之后,Webrick给了我这个输出:
Started POST "/api/user" for ::1 at 2015-08-03 17:06:50 +0200
Processing by Api::UserController#create as JSON
Parameters: {"name"=>"timoteo", "address"=>"berlin"}
(1.2ms) BEGIN
SQL (0.6ms) INSERT INTO "users" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id" [["created_at", "2015-08-03 15:06:50.646169"], ["updated_at", "2015-08-03 15:06:50.646169"]]
(42.8ms) COMMIT
(0.3ms) BEGIN
(0.3ms) COMMIT
Completed 201 Created in 66ms (Views: 1.4ms | ActiveRecord: 48.1ms)
忽略了这两个参数和一个像这样的空空记录存储在数据库中(REST客户端也向我显示了相同的内容)
{"id":19,"name":null,"address":null,"created_at":"2015-08-03T15:06:50.646Z","updated_at":"2015-08-03T15:06:50.646Z"}
有人可以给我一些暗示在途中可能出错的地方。我认为它是params hash的东西,但我还是想不通。
答案 0 :(得分:1)
为您的模型添加验证:
class User < ActiveRecord::Base
validates_presence_of :name
validates_presence_of :address
end
这将禁止使用空白属性保存记录。
然后,将您的#save
调用更改为控制器中的#persisted?
(因为记录是在调用#create
后立即创建的,它已经保存或失败了)
if @user.persisted?
format.json{render json: @user, status: :created, location: @user} #render create full response
else
format.json{render json: @user.errors, status: :unprocessable_entity}
end
<强> UPD 即可。您也可以从您接受的白名单参数中受益:
@user = User.create(params.require(:name, :address))
这样Rails会回复错误,说参数丢失,并且不会为用户分配任何其他属性(你不想分配)。
答案 1 :(得分:1)
当您的用户创建为{ "name": "timoteo", "address": "berlin" }
@user = User.create(params[:user])
的参数不正确
你的params看起来更像是:{ "user": { "name": "timoteo", "address": "berlin" } }
,因为您正在访问params[:user]
,因此用户属性需要属于参数的用户部分。
添加验证可能会有所帮助,如果它不能保存没有名称/地址的用户。
class User < ActiveRecord::Base
validates :name, presence: true
validates :address, presence: true
# etc...
end