Я думаю, было бы проще, если вы используете accepts_nested_attributes_for
.Итак, к вашей Product
модели добавьте:
accepts_nested_attributes_for :shop
И затем в зависимости от значения списка выбора вы можете изменить форму (в js), так что будет либо поле shop_id
, либо целый наборполей для магазина:
<% f.fields_for :shop do |sf| %>
...
<% end %>
Тогда, если пользователь выбирает существующий магазин, он пропустит только shop_id
, но если пользователь выберет новый магазин, то форма также пропустит и новый связанный объект.Если вы хотите, чтобы название магазина было уникальным, просто добавьте validates_uniqueness_of
к Shop
модели.
Если проверка магазина не удалась, продукт не будет сохранен.По сути, ваш контроллер остается настолько простым, насколько это возможно (просто создавая новый объект продукта из params - вам нет дела до магазина там).