2016-11-02 2 views
0

Zum Beispiel habe ich ein product Modell. Jedes Produkt hat eine type mit dem Namen ProductType. Jetzt möchte ich ein Produkt erstellen.Rails: form_for mit Submodell für Benutzer

Hier ist meine einfache Form ist mit schlank:

= form_for @product, url: product_path, :html => {:method => post} do f 
    = f.label :name 
    = f.text_field :name 
    = f.submit 'Create' 

ich in dieser Form wollen, gibt es eine Dropdown-Liste, die alle Arten von Produkt (Last von ProductType) auflisten und Benutzer auswählen können. Wie kann ich dies in Schienen zu tun (mit form_for)

dank

Antwort

1

collection_select für genau diesen Zweck gebaut wird.

Unter der Annahme, ProductType hat ein name Attribut, versuchen

= form_for @product, url: product_path, :html => {:method => post} do f 
    = f.label :name 
    = f.text_field :name 

    # collection_select creates a select box with the options set from the collection 
    = f.label :type 
    = f.collection_select :type, ProductType.all, :name, :id 

    = f.submit 'Create' 

in der Dokumentation: http://apidock.com/rails/v4.2.7/ActionView/Helpers/FormOptionsHelper/collection_select

+0

Vielen Dank. Ich habe ein bisschen mehr Fragen. In meinem Produkt habe ich zwei Felder: 'type_id' und' type_name' (zur Verhinderung der Abfrage 'ProductType' Tabelle). Wie kann ich 'form_for' verstehen und sowohl' id' als auch 'name' von' ProductType' zu ​​'Product' Tabellenfeldern senden. (also muss ich nicht erneut 'ProductType' abfragen, um den Namen von der ID zu erhalten). Danke –

+0

Ich empfehle, dies als separate Frage zu veröffentlichen, so dass jeder davon profitieren kann. Kurz gesagt, ich empfehle, im 'Product'-Modell einen 'before_save'-Callback zu verwenden, um den' name' zu ​​setzen. Gerne, um einen separaten Beitrag zu erarbeiten, wenn Sie –

+0

und eine weitere Sache möchten. Wie ich im Dokument lese, verwenden sie etwas wie: 'collection_select (: post,: autor_id, Autor.all,: id,: name_with_initial, prompt: true)'. Also sollte es in meinem Fall sein: 'f.collection_select: product,: type, ProductType.all,: name,: id'. Aber wenn ich das tue, treffe ich den Fehler: 'undefined Methode' merge 'für: name: Symbol'. Danke –

Verwandte Themen