2016-11-02 2 views
0

Например, у меня есть модель product. Каждый продукт имеет один type по имени ProductType. Теперь я хочу создать продукт.Рельсы: form_for с подмоделью для выбора пользователем

Вот моя простая форма использования тонкий:

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

Я хочу, чтобы в этой форме, есть выпадающий список, список всех видов продукции (нагрузки от ProductType) и пользователь может выбрать один. Как я могу это сделать в рельсах (с использованием form_for)

благодаря

ответ

1

collection_select построен именно для этой цели.

Предполагая 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' (для предотвращения запроса 'ProductType' table). Как я могу заставить 'form_for' понимать и отправлять как' id', так и 'name' из' ProductType' в поля таблицы «Product» соответственно. (поэтому мне не нужно снова запрашивать «ProductType» для получения имени от id). спасибо –

+0

Я рекомендую опубликовать это как отдельный вопрос, чтобы каждый мог извлечь из этого выгоду. Короче говоря, я рекомендую использовать обратный вызов 'before_save' в модели' Product' для установки 'name'. Приятно продумать отдельный пост, если вы хотите –

+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 'для: name: Symbol'. thanks –

Смежные вопросы