collection_check_boxes во вложенных формах не будет правильно вставляться в таблицу соединений со многими ко многим

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня есть вложенные формы, которые пытаются сделать вставку в Categorization модель для каждого флажка. В результате я не получаю ошибок, но один из атрибутов Categorization модели не вставляется в таблицу. Вот как выглядит хэш с 2 из 3 установленных флажков : "categorizations_attributes"=>{"0"=>{"clothing_size_id"=>["1", "2", ""]}}}

Вставка выглядит следующим образом: SQL (0.4ms) INSERT INTO "categorizations" ("created_at", "product_id", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["created_at", Mon, 23 Jun 2014 17:44:45 UTC 00:00], ["product_id", 15], ["updated_at", Mon, 23 Jun 2014 17:44:45 UTC 00:00]]

Вставка должна быть сконструирована с помощью a "clothing_size_id" , как я думаю ("created_at", "product_id", "updated_at", "clothing_size_id")

Как мне заставить это правильно вставить?

Размеры одежды из ClothingSize модели отображаются с помощью флажков в Product форме. Предполагается, что каждый флажок должен составлять 1 строку в Categorization модели с одинаковым product_id и clothing_size_id установленным для каждого флажка.

Модели

Продукт

 has_many :categorizations, dependent: :destroy
has_many :clothing_sizes, through: :categorizations

accepts_nested_attributes_for :categorizations
accepts_nested_attributes_for :clothing_sizes
 

Категоризация

 belongs_to :product
belongs_to :clothing_size

accepts_nested_attributes_for :clothing_size
 

Размер одежды

 has_many :categorizations
has_many :products, through: :categorizations

accepts_nested_attributes_for :categorizations
accepts_nested_attributes_for :products
 

Контроллер продуктов

 def new
  @product = Product.new
  @product.categorizations.build
end

def product_params
  params.require(:product).permit(:title, :description, 
    :image_url, :image_url2, :price, :quantity, :color, 
    :clothing_sizes_attributes => [:sizes, :clothing_size_id],
    :categorizations_attributes => {:clothing_size_id => []})
end
 

_form для продуктов

 <%= form_for(@product) do |f| %>
  <%= f.fields_for :categorizations do |cat| %>
    <div class="field">
      <%= cat.collection_check_boxes :clothing_size_id, ClothingSize.all, :id, :sizes, {prompt: "Size"}  %>
    </div>
  <% end %>
  <%= f.submit 'Save Product'%>
<% end %>
 

Комментарии:

1. Что произойдет, если вы измените все экземпляры clothing_size_id на множественное число, clothing_size_ids ?

2. Привет, Джо. Я получаю undefined method 'clothing_size_ids' for #<Categorization:0x007fb7f00a0370> , когда я делаю это множественным числом в представлении. Я получаю Unpermitted parameters: clothing_size_id , когда я делаю его множественным в Products контроллере в def product_params method

Ответ №1:

Я думаю, вы хотите убрать свои идентификаторы размеров одежды из категорий.

 <%= form_for(@product) do |f| %>
  <div class="field">
    <%= f.collection_check_boxes :clothing_size_ids, ClothingSize.all, :id, :sizes { prompt: "Size" } %>
  </div>
<% end %>
 

А затем в вашем контроллере:

 def product_params
  params.require(:product).permit(:title, :description, 
         :image_url, :image_url2, :price, :quantity, :color, 
         { clothing_size_ids: [] })
end
 

И, наконец, я не думаю, что вам нужно принимать вложенный атрибут для любой ассоциации в вашей модели продукта.

 class Product < ActiveRecord::Base
  has_many :categorizations, dependent: :destroy
  has_many :clothing_sizes, through: :categorizations

  # accepts_nested_attributes_for :categorizations
  # accepts_nested_attributes_for :clothing_sizes
end
 

конец

Попробуйте это и дайте мне знать, работает это или нет.

Комментарии:

1. Это работает. Так что, я думаю, не нужно accepts_nested_attributes_for использовать ни одну из моделей для этой ситуации, потому clothing_size_id что это часть Categorization модели, и не сохраняются другие атрибуты, которых нет в Product модели?

2. Я считаю, что вы правы, они вам не нужны. Как правило, вам никогда не понадобятся вложенные атрибуты для модели соединения (иначе вашей Categorization модели), и единственная причина ClothingSize , по которой вам понадобятся вложенные атрибуты, — это если вы на самом деле создаете размеры одежды для каждого продукта. Поскольку в этом случае кажется, что вы создаете размеры одежды отдельно, вам не понадобятся вложенные атрибуты.

3. Я понимаю. Еще раз спасибо. Похоже, я сделал все еще сложнее, чем есть на самом деле.

4. Никаких проблем! И это происходит. Вот для чего нужен SO. Я бы также посоветовал ознакомиться с Направляющими рельсов , если вы еще этого не сделали. Они невероятно полезны, и я практически каждый раз, когда возвращаюсь к ним, узнаю что-то новое.

5. @JoeKennedy Большое вам спасибо за ваш ответ, это намного проще, чем другие ответы SO, но я действительно боролся с этим!