Форма POST для ItemsController # create и CategoryorizationsController # create не вызывается (это можно проверить с помощью некоторой puts
отладки ).
Вы можете использовать accepts_nested_attributes_for
, чтобы действие создания элемента выполняло всю работу. Хитрость заключается в том, чтобы создавать только ассоциации категорий, чьи флажки установлены, и это можно сделать с помощью параметра :reject_if
( для получения дополнительной информации см. Документацию по Rails API * ):
приложение / модели / item.rb:
class Item < ActiveRecord::Base
has_many :categorizations
has_many :categories, :through => :categorizations, :source => :category
accepts_nested_attributes_for :categories,
:reject_if => proc{|c| c[:persist].blank?}
end
Затем вы можете создавать поля формы для вложенных объектов, по одному флажку на категорию.
приложение / просмотров / элементы / new.html.erb:
<%= form_for @item do |f| %>
<%# stuff to generate item fields... %>
<%= f.fields_for :categories do |cat| %>
<%= cat.check_box :persist %>
<%= cat.label :name, cat.name %>
<%- end %>
<%# submit button, etc. %>
<%- end %>
Заполните набор категорий для выбора при создании нового элемента, создав (но не сохранив) категории, связанные с элементом. Это эффективно перемещает код с вашего взгляда на контроллер:
приложение / контроллеры / items_controller.rb:
def new
@item = Item.new
Category.all.each {|cat| @item.categories.build(cat.attributes) }
end
В этом действии контроллера будет puts
params
, чтобы вы могли видеть, как выглядят хэши, отправляемые из формы.