Несколько моделей, одна форма в rails. Хотите создать родительский объект при создании вложенного объекта модели в форме

#ruby-on-rails-3 #forms #nested #models

#ruby-on-rails-3 #формы #вложенный #Модели

Вопрос:

Я хочу обновить несколько моделей одной формой в rails. Я просмотрел Railscasts # 196 и множество примеров вложенных моделей, но не могу заставить их работать. Разница в том, что я хочу создать запись в родительской модели в форме для дочерней модели.

У меня есть эти 3 модели:
Пользовательская модель
has_many: продукты
, has_many: магазины

Модель продукта
принадлежит тому, кто:пользователь
принадлежит тому, кто:магазин
accepts_nested_attributes_for :store

Храните модель
has_many: products

У меня есть форма, в которую пользователь может ввести продукт. Я хочу, чтобы у него было поле, в котором они также могут входить в хранилище. Эта запись создаст запись в модели магазина, а также модель продукта с идентификатором store_id, сохраненным в модели магазина.

Форма

 <%= form_for @product, :html => { :multipart => true } do |f| %>
<%= f.text_field :product_name %>
    <% f.fields_for :store do |store|%>
        <%= store.text_area :store_name %>
    <%end%>
<% end %>
  

Контроллер

     @product = Product.new
    @product.store.build
  

Этот код приводит к следующей ошибке :

неопределенный метод `build’ для nil:NilClass

Я просто хочу иметь возможность создавать новую запись в магазине по мере того, как они вводят товар. (если это дублирующаяся запись, я этого не допущу, но я разберусь с этим в другом месте). Есть предложения?

Ответ №1:

accepts_nested_attributes_for

Работает только для отношений «один к одному» и «один ко многим», где у вас есть основная модель, являющаяся основным родителем.. Вы бы использовали его в пользовательской модели для продуктов и / или магазинов. Однако, похоже, вы хотите создать новое хранилище при вводе продукта, если хранилище не существует, верно?

Поскольку кажется, что ваше хранилище — это всего лишь поле или два, я бы просто добавил хранилище в контроллер, используя поля для него..