Rails 4,嵌套属性,强参数& JSON

时间:2014-07-11 13:36:59

标签: ruby-on-rails activerecord strong-parameters

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吗?我已经玩弄了所有这些,但没有运气 - 我很确定有一些明显的东西,我只是没有看到。

此外,如果任何人都有办法记录输出问题来自哪里的数据,那将来会有所帮助。

1 个答案:

答案 0 :(得分:1)

你的问题就在这一行:

@status.positions.build

只有new方法才能构建HTML表单,这在这种情况下显然不适用。此方法实际上消除了您要发布的所有position个参数。

删除此行将解决您的问题。