2017-11-16 5 views
0

Wenn ich ein Modell mit verschachtelten Attributen bearbeite, funktioniert alles einwandfrei. Wenn ich versuche, einen neuen Datensatz mit verschachtelten Attributen zu erstellen, werden die verschachtelten Attribute nicht in dem Formular mit den verschachtelten Attributen angezeigt. Ich habe zwei Modelle wie folgtVerschachtelte Attribute, die bei der Bearbeitung angezeigt werden, aber nicht beim Erstellen eines neuen Datensatzes in Schienen

class JobSpec < ActiveRecord::Base 
    has_many :availabilities 
    accepts_nested_attributes_for :availabilities, allow_destroy: true 
end 

und

class Availability < ActiveRecord::Base 
    belongs_to :job_spec 
end 

im job_specs_controller Ich habe

class JobSpecsController < ApplicationController 
    def new 
    @job_spec = JobSpec.new 
    @availabilities = Availability.none 
    availability = Availability.new 
    availability.job_spec = @job_spec 
    @availabilities << availability 
    end 

    def edit 
    @job_spec = JobSpec.find(params[:id]) 
    @availabilities = @job_spec.availabilities 
    end 

    def job_spec_params 
    params.require(:job_spec).permit(
     ... all of the job_spec attributes, 
     availabilities_attributes: [:id, ... all of the availability attributes], 
    ) 
    end 
end 

In _form für job_spec Ich habe

<% @availabilities.each do |availability| %> 
    <%= f.fields_for availability do |builder| %> 
     <%= render partial: 'availabilities/form_mini', 
     locals: {f: builder, availability: availability} %> 
    <% end %> 
    <% end %> 

Da die Bearbeitung funktioniert, nehme ich an, dass es nicht viel falsch ist. Irgendwelche Ideen?

aktualisieren

Ich habe die Probleme fast aussortiert alle, aber immer noch eine haben. Hier ist, was ich getan habe.

1) Ich musste die job_specavailabilities bauen. Die neue Aktion des JobSpecsController sieht nun wie folgt

def new 
    @job_spec = JobSpec.new 
    @job_spec.client_id = params[:client_id] 
    @job_spec.availabilities.build 
    end 

2) Ich wollte das zerstören können, die verschachtelten Modelle, also musste ich :_destroy in den verschachtelten Attributen job_spec_params zu übergeben. Das Verfahren sieht wie folgt schließlich

def job_spec_params 
    params.require(:job_spec).permit(
     ... all of the job_spec attributes, 
     availabilities_attributes: [:id, :_destroy, ... all of the availability attributes], 
    ) 
    end 
end 

3), hatte ich _form für job_spec zu ändern. Ich habe

Das einzige Problem, das ich jetzt habe, ist, dass ich übergeben und Instanz Variable durch meine Verfügbarkeit Teiltage. So etwas wie dieses

<%= render partial: 'availabilities/form_mini', locals: {f: builder, a: availability} %> 

Wie sollte das getan werden? Ich bin nicht sicher, wie man beim Rendern aller Teiltöne über alle @availabilities iterieren.

Antwort

0

Ich bin froh, dass Sie einige der Probleme ausgearbeitet haben. Erste eine kleine Verbesserung

#job_specs_controller.rb 

def new 
    @job_spec = JobSpec.new(client_id: params[:client_id]) 
    @job_spec.availabilities.build 
end 

Und um Ihre letzte Ausgabe zu überwinden, ist die Lösung eine Mischung aus dem, was Sie vorher und nachher hatten. Sie können das tatsächliche Objekt in der fields_for-Methode übergeben. Es ist so:

#_form.html.erb 
<% @job_spec.availabilities.each do |availability| %> 
    <%= f.fields_for :availabilities, availability do |builder| %> 
    <%= render partial: 'availabilities/form_mini', 
     locals: {f: builder, a: availability} %> 
    <% end %> 
<% end %> 
Verwandte Themen