Rails 4 - поля вложенных объектов принадлежат_ не сохраняются

Примечание: я прочитал пару сообщений, подобных этому. Но ни одно из решений не работает для меня.
У меня есть два объекта Appeal и Appealer с отношениями один ко многим. Когда я сохраняю объект Appeal, все поля сохраняются, а также сохраняется идентификатор обработчика (как FK). Но в таблице Appealer новая запись сохраняется без данных, кроме идентификатора.

МОДЕЛЬ

class Appeal < ActiveRecord::Base
    belongs_to :appealer, :autosave => true
    accepts_nested_attributes_for :appealer
end

class Appealer < ActiveRecord::Base
    has_many :appeals, :autosave => true
end

AppealsController

class AppealsController < ApplicationController
    def index
        respond_with Appeal.all
    end

    def create
        appealer = Appealer.create(appealer_params)
        @appeal = Appeal.create(appeal_params)
        @appeal.appealer = appealer


        if @appeal.save
          respond_with @appeal
        else
          respond_with {:error}
        end
    end

    def show
        respond_with Appeal.find(params[:id])
    end

    private
    def appeal_params
        params.require(:appeal).permit(:subject, :status, :submit_means, :card_type, :submit_date, :relationship, :report_date, :explanation, :email_approval)
    end
    def appealer_params
        params.require(:appeal).permit(appealer: [:appealer_id, :first_name, :last_name])
    end
end

РЕДАКТИРОВАТЬ Вот JSON, который я использую

{
        "id": 21,
        "subject": "axxxscaaaa",
        "status": "happy",
        "submit_means": "DOAR",
        "card_type": "sdsd",
        "submit_date": 1466629200000,
        "relationship": null,
        "report_date": 1466542800000,
        "explanation": "sdsd",
        "email_approval": null,
        "appealer": {"first_name":"aaaaaaa", "last_name":"fffff"},
        "selfRequest": false,
        "created_at": 1465851600000,
        "updated_at": 1465333200000
    }

Я не понимаю, почему поля апеллянта не сохраняются

2 ответа

Решение
  • Когда вы показываете объект JSON, вы не используете rails fields_for или что-то в форме представления. Так что вам не нужна эта строка (accepts_nested_attributes_for: appealer) в вашей модели. Модель должна быть такой:

      class Appeal < ActiveRecord::Base
        belongs_to :appealer, :autosave => true
      end
    
  • Следующая вещь, в вашей текущей логике, для вашего appealer_params, измените метод appealer_params следующим образом:

    def appealer_params
      params.require(:appealer).permit(:first_name, :last_name)
    end
    
  • Создайте логику действий для вашего сценария:

    def create
      @appeal = Appeal.new(appeal_params)
      if appealer_params.present?
        appealer = Appealer.create(appealer_params)      
        @appeal.appealer = appealer
      end
    
      if @appeal.save
        respond_with @appeal
      else
        respond_with {:error}
      end
    end
    

Попробуй это

def appeal_params
   params.require(:appeal).permit(:subject, :status, :submit_means, :card_type, :submit_date, :relationship, :report_date, :explanation, :email_approval, appealers_attributes: [:id, :first_name, :last_name] )
end

и удали эту строку appealer = Appealer.create(appealer_params)

Другие вопросы по тегам