Вложенная ассоциация имеет множество;through не обновляет collection_check_boxes

#ruby-on-rails #ruby #nested #simple-form

#ruby-on-rails #ruby #вложенный #простая форма

Вопрос:

Используя флажки для обновления вложенной формы, я не могу обновить таблицы. Я получил следующее сообщение:

Недопустимый параметр: :категория
ActionController::Параметры {«name»=>»Конденсатор потока», «price» => «19.55»} разрешено: true

Я пробовал разные способы исправить это с помощью разрешенных параметров, включая :category параметр, например, так:

 def product_params
  params.require(:product).permit(:id, :name, :price, :category, categories_attributes: [:id, :name, :category], categorizations_attributes: [:id, :product_id, :category_ids, :category])
end
  

Мои модели

 class Product < ApplicationRecord
  has_many :categorizations
  has_many :categories, through: :categorizations
  accepts_nested_attributes_for :categories, reject_if: proc {|attributes| attributes['name'].blank?}
  accepts_nested_attributes_for :categorizations
end
  
 class Categorization < ApplicationRecord
  belongs_to :product, inverse_of: :categorizations
  belongs_to :category, inverse_of: :categorizations
end
  
 class Category < ApplicationRecord
  has_many :categorizations
  has_many :products, through: :categorizations, inverse_of: :category
end
  
 class ProductsController < ApplicationController

  def edit
    @categories = Category.all
  end

  def new
   @product = Product.new
  end

  def create
    @product = Product.new(product_params)
    if @product.save
      flash[:notice] = 'Product succesfully created'
      redirect_to products_path
    else
      flash[:notice] = 'Product was not created'
      render 'edit'
    end
  end

  def update
    if @product.update(product_params)
      flash[:notice] = "Product succesfully updated"
      redirect_to products_path
    else
      flash[:notice] = 'Product was not updated'
      render 'edit'
    end
  end
  

приложение / просмотр / продукты / редактирование.html.erb

 <%= simple_form_for(@product) do |f| %>
  <%= f.input :name %>
  <%= f.input :price %>
  <%= f.simple_fields_for @product.categories do |cats| %>
    <%= cats.collection_check_boxes  :ids, Category.all, :id, :name, collection_wrapper_tag: :ul, item_wrapper_tag: :li %>
  <% end %>
  <%= f.button :submit %>
<% end %>
  

Это кажется чем-то достаточно распространенным, что rails и / или simple_form должны предоставлять более встроенный способ сделать это. Я упускаю что-то очевидное?

Ответ №1:

Если я вас правильно понимаю, вы должны быть в состоянии сделать это без использования accepts_nested_attributes_for или simple_fields_for. Попробуйте что-то вроде этого:

 <%= simple_form_for(@product) do |f| %>
  <%= f.input :name %>
  <%= f.input :price %>
  <%= f.association :categories, as: :check_boxes %>
  <%= f.button :submit %>
<% end %>
  

ваши сильные параметры должны выглядеть примерно так:

 def product_params
  params.require(:product).permit(:id, :name, :price, { category_ids: [] }])
end
  

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

1. Это работает!. Отлично, большое спасибо @Ben_Trewem. Но теперь я еще больше запутался. 1) Почему не нужен помощник ‘accepts_nested_attributes_for’, который явно был вложенной формой двух моделей? . Предположительно, из-за типа поля ассоциации simple_form. 2) Почему вместо использования параметров категории необходимо использовать ‘category_ids’ для передачи параметров методу обновления продукта . 3) Где ссылки на информацию, которая позволяет простым смертным изучать и понимать механику и концепции, связанные с этими проблемами?. Еще раз спасибо.

2. То, что у вас есть, — это ассоциация habtm между продуктами и категориями, использующая категоризации в качестве таблицы объединения. simple_form поддерживает эти типы ассоциаций и просто передает идентификаторы категорий в ассоциацию. Вы должны добавить category_ids к разрешению строгих параметров, чтобы разрешить массовое назначение этих параметров в ваших действиях по созданию / обновлению.