2016-11-02 3 views
0

Par exemple, j'ai un modèle product. Chaque produit a un type nommé ProductType. Maintenant, je veux créer un produit.Rails: formulaire_for avec sous-modèle pour la sélection de l'utilisateur

Voici ma forme simple à l'aide mince:

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

Je veux sous cette forme, il y a une liste déroulante qui liste tous les types de produits (charge de ProductType) et l'utilisateur peut choisir un. Comment puis-je faire cela dans des rails (en utilisant form_for)

grâce

Répondre

1

collection_select est construit dans ce but précis.

En supposant ProductType a un attribut name, essayez

= 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' 

Consultez la documentation: http://apidock.com/rails/v4.2.7/ActionView/Helpers/FormOptionsHelper/collection_select

+0

merci beaucoup. J'ai un peu plus de question. Dans mon produit, j'ai deux champs: 'type_id' et' type_name' (pour empêcher la table 'ProductType' de la requête). Comment puis-je faire comprendre 'form_for' et envoyer respectivement les champs' id' et 'name' de ProductType' vers les champs de la table' Product'. (donc je n'ai pas besoin de demander à nouveau 'ProductType' pour obtenir le nom de l'ID). merci –

+0

Je recommande d'afficher ceci comme une question distincte afin que tout le monde puisse en bénéficier. En bref, je recommande d'utiliser un rappel 'before_save' dans le modèle' Product' pour définir 'name'. Heureux d'élaborer sur un poste séparé si vous souhaitez –

+0

et encore une chose. Comme je l'ai lu dans le document, ils utilisent quelque chose comme: 'collection_select (: post,: id_auteur, Author.all,: id,: name_with_initial, prompt: true)'. Donc, dans mon cas, il devrait être: 'f.collection_select: produit,: type, ProductType.all,: nom,: id'. Mais quand je fais cela, je rencontre l'erreur: 'méthode non définie' fusionner 'pour: name: Symbol'. merci –