2016-11-10 5 views
0

Ist es möglich, einen simple_fields_for Eingang mit Daten von einem anderen Objekt zu füllen?Prefill ein verschachteltes Element mit simple_form

Ich habe ein User Objekt. User has_one Backpack, Backpack viele Pockets und Pocket has_many Items

hat Wenn meine Form Gebäude, i

<%= f.simple_fields_for :backpack do |backpack| %> 
     <%= render 'backpack', f:backpack %> 
    <% end %> 

Jetzt bin mit, wenn ich auf users#new bin, ist die ganze Form leer. Ich möchte die Backpack Felder mit Daten von einem anderen Backpack Objekt initialisieren, ist es möglich? Ich habe versucht, mit diesem zu tun: mit diesem

<%= f.simple_fields_for :backpack, @backpack do |backpack| %> 
     <%= render 'backpack', f:backpack %> 
    <% end %> 

zusammen in meinem UsersController:

@user = User.new 
@backpack = Backpack.find(1).deep_clone include: [ :pockets, { pockets: :items } ] 

Aber das funktioniert nicht: aus irgendeinem Grund die Backpack Felder ausgefüllt sind, aber seine Pockets und ihre Items sind leer. Ich habe so ziemlich alles ausprobiert, was mir in den Sinn kam: meine Routen auf verschachtelte Objekte überprüft, mit und ohne deep_cloning versucht, verschachtelte Objekte sind nirgendwo zu finden, was mich wundern lässt, ist es überhaupt möglich ein Formular mit vorgefüllten verschachtelten zu initialisieren Modelle?

EDIT:

Ok, aus irgendeinem Grund so, wenn ich einen

<% @backpack.pockets.each do |pocket| %> 
    <%= pocket.title %> 
<% end %> 

setzen Sie alle Taschen Titel zeigt, was bedeutet, dass ich erfolgreich den Rucksack geklont, ABER, mit dies:

<%= f.simple_fields_for :pockets, @backpack.pockets do |pocket| %> 
    <%= render 'pocket', f: pocket %> 
<% end %> 

Nichts wird angezeigt.

Antwort

0

Ok, so scheint es, dass der Klon nicht gespeichert wird, daher wird die Verwendung des simple_fields_for nur dazu führen, dass die direkten Attribute vorbefüllt werden, und keines der verschachtelten Modelle, daher müssen Sie die speichern Klon, seine Attribute aus dem requestion params entfernen, und erstellen Sie es separat

@backpack = Backpack.find(1).deep_clone include: [ :pockets, { pockets: :items } ] 
@backpack.save 

und dann in der Users#create Methode

@user = User.new(user_params.except(:backpack_attributes)) 
@backpack = Backpack.new(params[:user][:backpack]) 
@backpack.save 
@user.backpack = @backpack 

auf diese Weise werden Sie Ihren neuen Benutzer und Ihre Form wird mit t vorgefüllt sein Er Rucksack Attribute und verschachtelte Attribute.

Verwandte Themen