Ruby on rails 未写入Rails Rest Post参数哈希
我正在使用Rails构建我的第一个RESTAPI,有一个我无法解决的简单问题 基本上,我无法从httpRuby on rails 未写入Rails Rest Post参数哈希,ruby-on-rails,rest,hash,Ruby On Rails,Rest,Hash,我正在使用Rails构建我的第一个RESTAPI,有一个我无法解决的简单问题 基本上,我无法从httpPUSH请求将params散列写入数据库 我在Api名称空间下有以下用户控制器,带有创建操作 class Api::UserController < ApplicationController http_basic_authenticate_with :name => "test", :password => "test" skip_before_act
PUSH
请求将params散列写入数据库
我在Api名称空间下有以下用户控制器,带有创建操作
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
用户模型没有包含名称和地址字符串
为了测试REST调用,我设置了firefox插件RESTeasy
和RESTclient
使用此URLhttp://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客户端也会显示相同的结果)
谁能给我一个提示,在路上可能出了什么问题。我假设这是与params散列有关的内容,但我还没有弄清楚。将验证添加到您的模型中:
class User < ActiveRecord::Base
validates_presence_of :name
validates_presence_of :address
end
UPD。您还可以从接受的白名单参数中获益:
@user = User.create(params.require(:name, :address))
这样,Rails将错误地响应,说参数丢失,并且不会将任何其他属性分配给用户(您不希望分配这些属性)。当您的用户创建为@user=user.create(params[:user])时,您的{“name”:“timoteo”,“address”:“berlin”}
参数不正确。
您的参数应该看起来更像:{“user”:{“name”:“timoteo”,“address”:“berlin”}
,因为您正在访问params[:user]
,所以用户属性需要属于参数的用户部分
如果保存没有姓名/地址的用户也不正确,则添加验证可能会有所帮助
class User < ActiveRecord::Base
validates :name, presence: true
validates :address, presence: true
# etc...
end
class用户
嘿,谢谢你的回答。我有一些验证,但为了使模型更简单而排除了它。使用validate_presence_of:name并将保存更改为persistend,我将无法再写了。RESTclient返回这个json消息{“name”:[“不能为空”]}。插入操作看起来和以前一样请从显示参数的日志中给出一行(参数:{…}
)哦,我在您的原始答案中看到了。似乎您需要像其他响应程序建议的那样修复参数哈希({user:{name:…,address:…}),然后一切正常。尝试重新启动服务器。确定列表是以下参数:{“name”=>“timoteo”,“address”=>“berlin”}当我忽略主体并使用此URL时,它会给出相同的结果。因此,我认为这不是ClientsYeah,您需要更改参数,或者将params[:user]
更改为params.permit(:name,:address)
谢谢你的回答。我想我现在理解了散列名称和发送参数之间的关系。我尝试了你建议的散列,我也包括了验证,但结果是一样的。开始发布“/api/user/”for::1于2015-08-03 17:58:18+0200由api::UserController处理#创建为JSON(2.0ms)开始(0.3ms)回滚已完成422个不可处理实体当您发出该请求时,日志中显示的参数是什么?这是日志参数中的参数列表:{{{{{“name\”:“timoteo\”,“address\”:“berlin\”}=>nil}未经允许的参数:{{“name”:“timoteo”,“address:“berlin”},格式我现在已更改参数[:user]至参数许可证(:名称:地址)
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
@user = User.create(params.require(:name, :address))
class User < ActiveRecord::Base
validates :name, presence: true
validates :address, presence: true
# etc...
end