2017-06-05 4 views
1

So habe ich ein Modell mit dieser Struktur:Rails 5 fields_for unter einer Sammlung nisten

document { 
    structure { 
    id, 
    ... 
    }, 
    fields { 
    field { 
     id, 
     ... 
    }, 
    value { 
     ... 
    } 
    } 
} 

Und ich versuche, gemeinsam ein Formular für die Felder zu bringen, wo die Felder aussehen würde:

<input type="hidden" name="document[fields][0][field][id]" /> 
<input type="text" name="document[fields][0][value]" /> 

<input type="hidden" name="document[fields][1][field][id]" /> 
<input type="text" name="document[fields][1][value]" /> 

... 

Das ist, was ich derzeit tue:

<%= document.fields.each_with_index do |df, i| %> 
    <%= f.fields_for "fields[]", df do |builder| %> 
     <p> 
     <%= builder.label df.field.name %> 
     <%= builder.fields_for :field do |field_builder| %> 
      <%= field_builder.hidden_field :id, value: df.field.id %> 
     <% end %> 

     <%= builder.fields_for :value do |value_builder| %> 
      <%= render df.field.edit_view, field: df.field, builder: value_builder %> 
     <% end %> 
     </p> 
    <% end %> 
    <% end %> 

Aber die daraus resultierenden Feldnamen sind:

document[fields][field][id] 
document[fields][value][value] 

Mit anderen Worten, die Indizes fehlen.

Die Verwendung von <%= builder.hidden_field :id, value: df.field.id %> ergibt das richtige Format, aber keinen Index (weil das Feldobjekt noch keine ID hat): document[fields][][id], aber das ist keine Option für Wert, da mehrere Felder beteiligt sein können.

Gibt es eine Möglichkeit, dies mithilfe der Formularhelfer zu tun, oder ist das, was ich gerade mache zu wackelig?

Edit: Hier sind die beteiligten Modelle:

Die Idee ist, eine konfigurierbare Menge von Feldern für Dokument zu haben. Die Struktur bestimmt verfügbare Felder, und ein Dokumentfeld ist eine Beziehung zwischen einem Dokument und einem Feld mit einem enthaltenen Wert.

class Field < ApplicationRecord 
    belongs_to :structure 
end 

class Document < ApplicationRecord 
    belongs_to :structure 
    has_many :document_fields 

class DocumentField < ApplicationRecord 
    belongs_to :document 
    belongs_to :field 

class Structure < ApplicationRecord 
    has_many :fields 
+1

Können Sie Ihre Modelle hinzufügen, um zu versuchen, Ihr Szenario zu reproduzieren? –

+0

Zum Beitrag hinzugefügt – user1456632

Antwort

1

Sie sollen ein nested attributes setup on your models, bauen diese verschachtelten Beziehungen auf dem Controller, konfigurieren und in Ihnen form_for Block stattdessen eine Referenzierung Symbol der Übergabe ein Objekt instanziiert.

+0

Das funktioniert für document_field [Feld], aber nicht für Wert, der kein separates Modell ist, es ist nur ein JSON-Objekt mit beliebig strukturierten Daten ... Wie verwende ich sowas wie accept_nested_attributes_for für sowas? – user1456632