7

I'm trying to get the product_suppliers to update via the product form. The form displays all suppliers in the supplier table but it doesn't update the join table. Not sure where the error lies. Index and show show correct details but edit is not updating the join table. Starting to go around and around in circles on this one.

Update: Changing the form to the below has got me close. But still not updating the join table. However delete works as expected if i manually add rows to the join table. They display and can be deleted. Saving adds new product_id into the row just not the associated supply_company_id value. I figure its an attribute issue but i cant see it.

app/models/product.rb

 class Product < ActiveRecord::Base
   ### shortned for clarity
  has_many :product_suppliers, :foreign_key => 'product_id'
  has_many :supply_companies, :through => :product_suppliers
  accepts_nested_attributes_for :product_suppliers, :allow_destroy => true
 end

app/models/supply_company.rb

 class SupplyCompany < ActiveRecord::Base
  has_many :products, :through => :product_suppliers
  has_many :product_suppliers, :foreign_key => 'supply_company_id'
 end

app/models/product_supplier.rb

class ProductSupplier < ActiveRecord::Base
 belongs_to :product
 belongs_to :supply_company
 accepts_nested_attributes_for :product
 accepts_nested_attributes_for :supply_company
end

/app/admin/product.rb

ActiveAdmin.register Product do

  # See permitted parameters documentation:
  # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters
  #
   permit_params :id, :product_name, :product_description, :product_type_id, :product_category_id, :product_colour_id, :product_size_id,
                             product_images_attributes: [:id, :product_id, :product_image, :_destroy],
                             product_types_attributes: [:id, :product_type],
                             product_catergories_attributes: [:id, :product_category],
                             product_colour_attributes: [:id, :product_colour],
                             product_size_attributes: [:id, :product_size],
                             product_suppliers_attributes: [:id, :product_id, :supply_company_id, :_destroy],
                             supply_companies_attributes: [:id, :company_name]

   form(:html => {:multipart => true}) do |f|
     f.inputs "Product Details" do
       f.input :id
       f.input :product_name
       f.input :product_description

#######################################################################
# Problem Lies with this piece of code Not saving the supply_company_id
# when adding a new row or updating the old rows. Delete works fine.
# cant see the error in models or permited_params.......
#######################################################################

             f.inputs "Suppliers" do
       f.has_many :product_suppliers do |ff|
      ff.input :supply_company_id, as: :select, multiple: true, collection: SupplyCompany.all.map {|u| [u.company_name.to_s, u.id]}
      ff.input :_destroy, :as=>:boolean, :required => false, :label => 'Remove supplier'
     end
    end

   ######################################################## 

       f.input :product_type_id, :as => :select, :collection => ProductType.all.map {|u| [u.product_type.to_s, u.id]}
       f.input :product_category_id, :as => :select, :collection => ProductCategory.all.map {|u| [u.product_category.to_s, u.id]}
       f.input :product_colour_id, :as => :select, :collection => ProductColour.all.map {|u| [u.product_colour.to_s, u.id]}
       f.input :product_size_id, :as => :select, :collection => ProductSize.all.map {|u| [u.product_size.to_s, u.id]}
       end

       f.inputs "Product images" do
         f.has_many :product_images do |p|
           p.input :product_image, :as => :file, :label => "Image",:hint => image_tag(p.object.product_image.url(:thumb))
           p.input :_destroy, :as=>:boolean, :required => false, :label => 'Remove image'
         end
       end
        f.actions
   end

product_suppliers_schema

 create_table "product_suppliers", force: true do |t|
    t.integer  "product_id"
    t.integer  "supply_company_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

Update: Changing the form to the below has got me close. But still not updating the join table. However delete works as expected if i manually add rows to the join table. They display and can be deleted. Saving adds new product_id into the row just not the associated supply_company_id value. I figure its an attribute issue but i cant see it.

   f.inputs "Suppliers" do
       f.has_many :product_suppliers do |ff|
      ff.input :supply_company_id, as: :select, multiple: true, collection: SupplyCompany.all.map {|u| [u.company_name.to_s, u.id]}
      ff.input :_destroy, :as=>:boolean, :required => false, :label => 'Remove supplier'
 end
end

1 Answers1

0

Turns out it was the multipart: :true in the code. Once I removed it from the below code everything worked as expected.

       form(:html => {:multipart => true}) do |f|
       f.inputs "Product Details" do
       f.input :id
       f.input :product_name
       f.input :product_description
       f.has_many :product_supply_companies do |ff|
       ###############################################
       #REMOVED multipart: :true from the line below
       ###############################################
         ff.input :supply_company_id, as: :select,  collection: SupplyCompany.all.map {|u| [u.company_name.to_s, u.id]} 
         ff.input :_destroy, :as=>:boolean, :required => false, :label => 'Remove supplier'
       end
       f.input :product_type_id, :as => :select, :collection => ProductType.all.map {|u| [u.product_type.to_s, u.id]}
       f.input :product_category_id, :as => :select, :collection => ProductCategory.all.map {|u| [u.product_category.to_s, u.id]}
       f.input :product_colour_id, :as => :select, :collection => ProductColour.all.map {|u| [u.product_colour.to_s, u.id]}
       f.input :product_size_id, :as => :select, :collection => ProductSize.all.map {|u| [u.product_size.to_s, u.id]}
       end

        f.inputs "Product images" do
         f.has_many :product_images do |p|
           p.input :product_image, :as => :file, :label => "Image",:hint => image_tag(p.object.product_image.url(:thumb))
           p.input :_destroy, :as=>:boolean, :required => false, :label => 'Remove image'
         end
       end
        f.actions
   end