2017-12-17 3 views
0

Ich versuche herauszufinden, das Format des Namens des Eingabefeldes für verschachtelte Attribute. Lassen Sie uns sagen, dass ich eine Bearbeitungsaktion mit Eingabefeldern haben:Rails post Parameter Namen Syntax?

<input type="text" name="..."> 

ich, dass die Syntax der Parameter für den Namen herausgefunden ist:

"controller_name[attribute_name]" 

Nach viel versucht, fand ich heraus, sogar, dass verschachtelte Hash-Parameter können übergeben werden, wie:

"controller_name[attribute_name][attribute_name]" 

Mein Problem ist, dass ich has_many verschachtelte Attribute haben, und ich habe es nicht geschafft, herauszufinden, was Syntax Schienen für Array von verschachtelten Datensätzen zu erwarten. Es ist auch schön zu wissen, wie ich etwas weitergeben kann, um zu sagen, dass ich einen verschachtelten Datensatz zerstören möchte.

Ich bin mit Rails 5.1 BTW

+0

Warum verwenden Sie nicht den Rails-Formularhelfer, der die erwarteten Namen für Sie generiert? – spickermann

Antwort

0

Normalerweise, wenn Sie has_many verwenden wird es accept_nested_attributes in Muttermodell haben.

zum Beispiel

Class Book 
    has_many :pages 

    accepts_nested_attributes_for :pages 
End 

so in der Ansicht wird es sein, diese

<input name="book[pages_attributes][0][id]" type="hidden" value="1" /> 
<input name="book[pages_attributes][0][name]" type="text" /> 
<input name="book[pages_attributes][1][id]" type="hidden" value="2" /> 
<input name="book[pages_attributes][1][name]" type="text" /> 

für zerstören Sie haben einen versteckten Eingang

<input name="book[pages_attributes][0][_destroy]" value="true" type="hidden" /> 

dies wird leicht das Buch Objekt aktualisieren und Seiten, wenn Sie tun

@book.update_attributes 
+0

Danke! Aber was ist 0? Die ID? nur eine Zahl, die für jeden Datensatz unterschiedlich sein muss? Wie kann ich Rails mitteilen, einen vorhandenen Datensatz zu zerstören? –

+0

0 bedeutet erste verwandte Seite Objekt Buch – praga2050

+0

aktualisiert meine Antwort viel besser für Ihr Verständnis – praga2050

1

Ich glaube, es geht ungefähr so:

<input name="user[posts_attributes][0][id]" value="5" /> 
<input name="user[posts_attributes][0][body]" value="You've given me too much to feel" /> 

<input name="user[posts_attributes][1][id]" value="8" /> 
<input name="user[posts_attributes][1][body]" value="You've almost convinced me I'm real" /> 

Denken Sie daran, dies zu Ihrem User-Modell hinzuzufügen:

class User < ApplicationRecord 
    has_many :posts 

    accepts_nested_attributes_for :posts 
end 

ich normalerweise verwenden Simple machen dies zu einem viel einfacher:

<%= simple_form_for @user do |f| %> 
    <%= f.simple_fields_for :posts do |f_post| %> 
    <%= f_post.input :body %> 
    <% end %> 
<% end %>