Rails 4,基本JSON API - 我想用关联位置对象更新Status对象。
工作状态模型:
class JobStatus < ActiveRecord::Base
belongs_to :job
has_many :positions
accepts_nested_attributes_for :positions, limit: 1
validates :job_id,
:slug,
presence: true
end
职位模型:
class Position < ActiveRecord::Base
belongs_to :agent
belongs_to :job_status
validates :job_status_id,
:agent_id,
:lat,
:lng,
presence: true
end
工作状态控制器:
class Api::V1::Jobs::JobStatusesController < ApplicationController
wrap_parameters format: [:json]
def create
@status = JobStatus.new(status_params)
@status.job_id = params[:job_id]
@status.positions.build
if @status.save
render :json => {status: 'success', saved_status: @status}.to_json
else
render :json => {status: 'failure', errors: @status.errors}.to_json
end
end
private
def status_params
params.permit(:job_id, :slug, :notes, :positions_attributes => [:lat, :lng, :job_status_id, :agent_id])
end
end
这是我发布的JSON:
{
"slug":"started",
"notes":"this xyz notes",
"positions_attributes":[{
"lat" : "-72.348596",
"lng":"42.983456"
}]
}
当我做&#34; logger.warn params&#34;紧靠@ status.positions.build:
{"slug"=>"started", "notes"=>"this xyz notes", "positions_attributes"=>[{"lat"=>"-72.348596", "lng"=>"42.983456"}], "action"=>"create", "controller"=>"api/v1/jobs/job_statuses", "job_id"=>"3", "job_status"=>{"slug"=>"started", "notes"=>"this xyz notes"}}
并且返回给我的错误消息:
{
"status":"failure",
"errors":{
"positions.job_status_id":[
"can't be blank"
],
"positions.agent_id":[
"can't be blank"
],
"positions.lat":[
"can't be blank"
],
"positions.lng":[
"can't be blank"
]
}
所以我不确定我的问题在哪里 - 我的强参数是不是正确的?我是否应该发布一系列职位,因为它是一个has_many关系,即使我只想一次创建一个?我没有正确使用.build吗?我已经玩弄了所有这些,但没有运气 - 我很确定有一些明显的东西,我只是没有看到。
此外,如果任何人都有办法记录输出问题来自哪里的数据,那将来会有所帮助。
答案 0 :(得分:1)
你的问题就在这一行:
@status.positions.build
只有new
方法才能构建HTML表单,这在这种情况下显然不适用。此方法实际上消除了您要发布的所有position
个参数。
删除此行将解决您的问题。