Rails 4, вложенные атрибуты, сильные параметры и JSON

Rails 4, базовый JSON API. Я пытаюсь обновить объект Status с помощью объектов Position.

Модель статуса работы:

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"
  }]
}

Когда я делаю «параметры logger.warn» непосредственно над @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? Я играл со всем этим, но не повезло - я почти уверен, что есть что-то очевидное, чего я просто не вижу.

Кроме того, если у кого-то есть способ регистрировать вывод данных из любого места, откуда исходит проблема, это было бы очень полезно в будущем.


person crypticsymbols    schedule 11.07.2014    source источник


Ответы (1)


Ваша проблема в этой строке:

@status.positions.build

Это требуется только в методе new для построения HTML-формы, что, очевидно, не применимо в данном случае. Этот метод фактически скрывает все position параметры, которые вы публикуете.

Удаление этой строки решит вашу проблему.

person San    schedule 11.07.2014
comment
Работал отлично. Спасибо! - person crypticsymbols; 13.07.2014