#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, но я действительно боролся с этим!