2016-11-02 2 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 사용).

name 속성이 ProductType를 가정하면,

= 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' 두 개의 필드가 있습니다 ('ProductType' 쿼리를 막기 위해). 'form_for '를 이해하고'Product'에서'Product' 테이블 필드로'id'와'name'을 각각 보내면됩니다. (그래서 나는 id에서 이름을 얻기 위해 다시'ProductType'을 질의 할 필요가 없습니다.) 덕분에 –

+0

나는이 질문을 모든 사람이 누릴 수 있도록 별도의 질문으로 게시하는 것이 좋습니다. 간단히 말해서,'name'을 설정하기 위해'Product' 모델에서'before_save' 콜백을 사용하는 것이 좋습니다. –

+0

과 다른 것을 하나 더하고자한다면 별도의 게시물을 작성하는 것이 좋습니다. 문서에서 읽을 때, 그들은'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'. thanks –