3

Hinweis: Ich habe ein paar ähnliche Beiträge gelesen. Aber keine der Lösungen funktioniert für mich.
Ich habe zwei Objekte Appeal und Appealer mit einer zu vielen Beziehung. Wenn ich das Appeal-Objekt speichere, werden alle Felder gespeichert und auch die Appeller-ID wird gespeichert (als FK). In der Appealer-Tabelle wird jedoch ein neuer Datensatz ohne Daten außer ID gespeichert.Schienen 4 - gehören zu verschachtelten Objektfeldern werden nicht gespeichert

MODEL

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 Hier ist die json Ich benutze

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

Ich verstehe nicht, warum die Bereiche appealer

+0

haben Sie durch http://railscasts.com/episodes/196-nested-model-form-part-1?vi gehen ew = asciicast – chaitanya

+0

Ja, ich bin schon durch dieses Beispiel gegangen und es hat nicht funktioniert. – nufar

+2

Können Sie 'appeler_attributes' in' appeler_params' verwenden? Wie das 'params.require (: appell) .permit (appeler_attributes: [: appeler_id,: Vorname,: Nachname]) '. Und ich glaube, Sie verwenden 'fields_for' bereits für' appellator'? –

Antwort

2
  • Wie Sie Objekt zeigt JSON, Sie sind nicht mit Rails fields_for oder etwas in Sichtform. Sie brauchen diese Zeile also nicht in Ihrem Modell (access_nested_attributes_for: appeler). Modell sollte wie folgt sein:

    class Appeal < ActiveRecord::Base 
        belongs_to :appealer, :autosave => true 
        end 
    
  • Das nächste, was, in der aktuellen Logik, für Ihre appealer_params, ändern appealer_params Methode mit diesem:

    def appealer_params 
        params.require(:appealer).permit(:first_name, :last_name) 
    end 
    
  • erstellen Aktionslogik für Ihr Szenario:

    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

und den Rest des Codes so lassen wie er ist? Wenn ich das tue bekomme ich einen Fehler "param fehlt oder der Wert ist leer: appeler" – nufar

+0

Ja in Ihrem aktuellen Szenario können Sie den Code so lassen, wie er ist. Aber wenn es möglich ist, leere Werte für Appeler-Daten oder keine Appeler-Daten zu erhalten. Dann müssen Sie damit umgehen. Gib mir ein genaues Szenario, dann werde ich meine Antwort aktualisieren. – Devd

+0

Der Aufrufer kann null sein (keine Daten), aber wenn es einen Aufrufer gibt, müssen alle 3 Felder mit Werten versehen sein. – nufar

0

dieses

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 

nicht gespeichert werden versuchen, und entfernen Sie diese Zeile appealer = Appealer.create(appealer_params)

+0

Danke, aber es hat nicht für mich funktioniert. – nufar

+0

Ok ich habe. Dies ist das Problem von field_for. – Anna88