3

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

МОДЕЛЬ

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 

EDIT Вот я использую 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 
    } 

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

+0

у вас есть http://railscasts.com/episodes/196-nested-model-form-part-1?vi ew = asciicast – chaitanya

+0

Да, я уже прошел этот пример, и это не сработало. – nufar

+2

Можете ли вы использовать 'апелляционный_атрибут' в' aspecter_params'? Подобно этому 'params.require (: апелляция) .permit (campaigner_attributes: [: campaigner_id,: first_name,: last_name])'. И я считаю, что вы уже используете 'fields_for' для' апеллятора'? –

ответ

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

    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 
    
+0

и оставить остальную часть кода как есть? Если я это сделаю, я получаю сообщение об ошибке «Параметр отсутствует или значение пуст: апелляционный» – nufar

+0

Да, в текущем сценарии вы можете оставить код таким, какой он есть. Но если возможно получить пустые значения для данных апелляционного лица или данные об отсутствии апелляции. Тогда вам нужно справиться с этим. Дайте мне точный сценарий, после чего я уточню свой ответ. – Devd

+0

Апелляционный может быть нулевым (никаких данных вообще), но если есть апелляционный, то все 3 поля должны иметь значения. – nufar

0

Попробуйте

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)

+0

Спасибо, но это не сработало для меня. – nufar

+0

Хорошо, я получил. Это проблема field_for. – Anna88