2016-11-02 3 views
0

例えば、私はproductモデルを持っています。各製品にProductTypeという名前のtypeがあります。今私は製品を作りたいと思う。レール:ユーザが選択するサブモデルを含むform_for

がここにスリム使用して、私の単純な形式です:私はこのフォームに必要

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

、いずれかを選択することができ、製品(ProductTypeからロード)し、ユーザーのすべての種類をリストドロップダウンリストがあります。どのように私は

答えて

1

collection_selectはまさにこの目的のために構築されてい

おかげで(form_forを使用して)レールでこれを行うことができます。 ProductTypeと仮定すると

name属性を持ち、

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

レビュードキュメント試してみてください。 http://apidock.com/rails/v4.2.7/ActionView/Helpers/FormOptionsHelper/collection_select

+0

感謝そんなに。もう少し質問があります。私の製品では、私は 'type_id'と' type_name'という2つのフィールドを持っています(クエリ 'ProductType'テーブルを防ぐため)。 'form_for'を理解し、' Product''から 'Product'テーブルのフィールドに' id'と 'name'の両方をそれぞれ送る方法を教えてください。 (したがって、idから名前を取得するために 'ProductType'を再度照会する必要はありません)。ありがとう –

+0

私は誰もがそれから恩恵を受けることができるように、別の質問としてこれを投稿することをお勧めします。つまり、 'Product'モデルの' before_save'コールバックを使用して 'name'を設定することをお勧めします。 –

+0

ともう1つのことをご希望の場合は、別の投稿で詳しいことができます。ドキュメントで読むと、 'collection_select(:post、:author_id、Author.all、:id、:name_with_initial、prompt:true)'のようなものが使われます。だから、私の場合は 'f.collection_select:product、:type、ProductType.all、:name、:id'でなければなりません。しかし、私がこれをすると、エラー: 'undefined method' merge for:name:Symbol'を満たします。ありがとう –

関連する問題