Search code examples
ruby-on-rails-4activeadminhas-many-throughformtastic

ActiveAdmin has_many through relationship not updating param Rails


I'm working through creating a has_many: through relationship in active admin. Here are the models as they stand:

 class Category < ActiveRecord::Base
   has_many :subcategories
 end

 class Subcategory < ActiveRecord::Base
   has_many :product_in_subcategories
   has_many :products, through: :product_in_subcategories
   accepts_nested_attributes_for :product_in_subcategories, :allow_destroy => true

   belongs_to :category
 end

 class Product < ActiveRecord::Base
   has_many :product_in_subcategories
   has_many :subcategories, through: :product_in_subcategories
   accepts_nested_attributes_for :product_in_subcategories, :allow_destroy => true
 end

 class ProductInSubcategory < ActiveRecord::Base
   belongs_to :product
   belongs_to :subcategory
 end

In ActiveAdmin I have the permit_params and form like so:

 ActiveAdmin.register Product do
   # note some params that are product only have been removed for simplicity
   permit_params :name, subcategory_id:[:id], product_in_subcategories_attributes: [:id, :subcategory_id, :product_id, :_create, :_update]

     form do |f|
       f.inputs

      f.has_many :product_in_subcategories do |s|
          s.input :subcategory_id, :as => :check_boxes, :collection => Subcategory.all
      end

      f.actions
    end
end

The form populates as should, and will save everything except for the subcategory_id. If I enter into the DB a proper subcategory_id the box will show checked on edit.

The messages when saving give:

 Unpermitted parameters: subcategory_id

However, it appears it is trying to submit this with the product, for which there isn't a subcategory_id. Any ideas on what I am doing incorrectly here? This is driving me nuts and I've read everything I can find. I'd really like to understand what I'm doing wrong. Thanks.


Solution

  • After much time spent on this one, I couldn't find a suitable solution except for this one, which is actually very nice. It in fact is not much different from my envisioned solution:

    The only changes to the above code were made in ActiveAdmin:

     ActiveAdmin.register Product do
        # note some params that are product only have been removed for simplicity
        permit_params :name, product_in_subcategories_attributes: [:id, :subcategory_id, :product_id, :_create, :_update]
    
          form do |f|
            f.inputs
    
            f.has_many :product_in_subcategories do |s|
               s.input :subcategory_id, :as => :select, :collection => Subcategory.all
            end
    
            f.actions
          end
     end
    

    Very strange how this allows a select box with no issues, but it flips out over check boxes. Nonetheless, I'm happy with the solution.