2015-06-01 2 views
6

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

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

приложение/модели/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 

приложение/модели/supply_company.rb

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

приложение/модели/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: Изменение формы к ниже получил меня близко. Но не обновлять таблицу соединений. Однако удаление работает, как ожидается, если я вручную добавлю строки в таблицу соединений. Они отображаются и могут быть удалены. Сохранение добавляет новый product_id в строку, а не связанное с ней значение supply_company_id. Я рассматриваю его проблему с атрибутом, но я не вижу его.

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 

ответ

0

Оказывается, это был код multipart:: true. Как только я удалил его из приведенного ниже кода, все работало, как ожидалось.

 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 
Смежные вопросы