2015-06-01 5 views
6

Ich versuche, die Produkt-Lieferanten über das Produktformular zu aktualisieren. Das Formular zeigt alle Lieferanten in der Lieferantentabelle an, aktualisiert jedoch die Join-Tabelle nicht. Nicht sicher, wo der Fehler liegt. Index und Show zeigen korrekte Details, aber Edit aktualisiert die Join-Tabelle nicht. Ich beginne damit, mich im Kreis zu drehen.ActiveAdmin geschachtelte Form mehrere wählen

Update: Das Ändern des Formulars auf das Unten hat mich nahe gebracht. Die Join-Tabelle wird jedoch immer noch nicht aktualisiert. Delete funktioniert jedoch wie erwartet, wenn ich der Join-Tabelle manuell Zeilen hinzufüge. Sie werden angezeigt und können gelöscht werden. Beim Speichern wird die neue product_id nur in die Zeile eingefügt, nicht jedoch der zugehörige Wert für supply_company_id. Ich denke, es ist ein Attribut, aber ich kann es nicht sehen.

app/Modelle/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/Modelle/supply_company.rb

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

app/Modelle/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: Ändern der Form an die unten hat mich der Nähe hat. Die Join-Tabelle wird jedoch immer noch nicht aktualisiert. Delete funktioniert jedoch wie erwartet, wenn ich der Join-Tabelle manuell Zeilen hinzufüge. Sie werden angezeigt und können gelöscht werden. Speichern fügt neue product_id in die Zeile ein, nur nicht den zugehörigen Wert von supply_company_id. Ich denke, es ist ein Attribut, aber ich kann es nicht sehen.

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 

Antwort

0

Es stellte sich heraus, dass es mehrteilig war:: wahr im Code. Sobald ich es aus dem untenstehenden Code entfernt habe, hat alles wie erwartet funktioniert.

 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