2016-07-28 34 views
0

Ich habe ein Lieferantenmodell, ein Produktmodell und ein Vendor_Produktmodell. In meinem Lieferantenformular habe ich verschachteltes Formular verwendet, um Lieferantenprodukte mit Attributen wie Lieferanten-ID, Produkt-ID und Kopien zu erstellen. Beim Erstellen eines neuen Lieferanten wird auch ein Lieferantenprodukt erstellt. Aber aus irgendeinem Grund, es nicht speichert die vendor_id und product_id in vendor_products Tabelle aber nur speichert die KopienVerschachtelte Formulare, die keine Daten in der Datenbank in Schienen speichern 4

Meine Verbände sind wie folgt

Ein Anbieter ->

 has_many :vendor_products 
     has_many :products, through: :vendor_products 

Ein Produkt ->

 has_many :vendor_products 
     has_many :vendors, through: :vendor_products 

A vendor_product

 belongs_to :vendor 
     belongs_to :product 

Vendor.rb

class Vendor < ActiveRecord::Base 

    has_many :vendor_products 
    has_many :products, through: :vendor_products 
    accepts_nested_attributes_for :vendor_products, :products, 
:allow_destroy => true 

end 

Mein Anbieter/_form.html.erb

<%= form_for(@vendor) do |f| %> 
<% if @vendor.errors.any? %> 
<div id="error_explanation"> 
    <h2><%= pluralize(@vendor.errors.count, "error") %> prohibited this 
vendor from being saved:</h2> 

    <ul> 
    <% @vendor.errors.full_messages.each do |message| %> 
    <li><%= message %></li> 
    <% end %> 
    </ul> 
    </div> 
<% end %> 

    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
</div> 
    : 
    : 
    : 
<%= f.fields_for :vendor_products do |vproducts| %> 
    <div class="field"> 
    <%= vproducts.label :product %><br> 
    <%= collection_select(:product, :product_ids, Product.all, :id, 
    :product_name, 
      {:prompt => 'Please select', :multiple => true }) %> 
    </div> 
    <div class="field"> 
    <%= vproducts.label :copies %><br> 
    <%= vproducts.number_field :copies %> 
    </div> 
    <% end %> 

<div class="actions"> 
    <%= f.submit %> 
</div> 
<% end %> 

Mein vendors_controller.rb

class VendorsController < ApplicationController 
     before_action :set_vendor, only: [:show, :edit, :update, :destroy] 
     respond_to :json 

     def index 
     @vendors = Vendor.all.limit(20) 
     end 


     def show 
     end 


     def new 
     @vendor = Vendor.new 
     @vendor.products.build 
     @vendor.vendor_products.build 
     end 


     def edit 
     end 


     def create 
     @vendor = Vendor.new(vendor_params)  

     respond_to do |format| 
     if @vendor.save 
      format.html { redirect_to @vendor, notice: 'Vendor was successfully 
    created.' } 
      format.json { render :show, status: :created, location: @vendor } 
     else 
      format.html { render :new } 
      format.json { render json: @vendor.errors, status: 
      :unprocessable_entity } 
     end 
     end 
     end 


    def update 
     respond_to do |format| 
     if @vendor.update(vendor_params) 
      format.html { redirect_to @vendor, notice: 'Vendor was successfully 
     updated.' } 
      format.json { render :show, status: :ok, location: @vendor } 
     else 
      format.html { render :edit } 
      format.json { render json: @vendor.errors, status: 
    :unprocessable_entity } 
     end 
     end 
    end 



     private 

     def set_vendor 
     @vendor = Vendor.find(params[:id]) 
     end 

     def vendor_params 
     params.require(:vendor).permit(:name, :email, :phone_no, :addressline1, 
     :addressline2, :landmark, 
     :city, :state, :country, :pincode, :latitude, :longitude, :status, 
     product_attributes: [:product_id, :product_name, :price ], 
     vendor_products: [:vendor_product_id, :vendor_id, :product_id, 
     :copies]) 
     end 
    end 

Jetzt ein Anbieter und VendorProduct erstellt, aber meine vendor_product sieht so aus

{"id":3, 
    "vendor_id":null, 
    "product_id":null, 
    "copies":4, 
    } 

Kann jemand darauf hinweisen, wie das zu beheben ist. Was mache ich falsch. Bitte beachten Sie, dass ich ein Railsnewbie bin.

Antwort

1
change once vendor_products to vendor_products_attributes and look 

Ihrer Ansicht

<%= collection_select(:product, :product_ids, Product.all, :id, 
    :product_name, 
      {:prompt => 'Please select', :multiple => true }) %> 

replace with 

<%= vproducts.select :product_id, options_from_collection_for_select(Product.all, "id", "name"), prompt: "Select something" %> 
+0

Nun, es bevölkerte die Vendor_id für jetzt, aber die Produkt-ID zeigt immer noch Null. Irgendetwas anderes, was ist falsch mit meiner Controller-Logik? –

+0

Überprüfen Sie dies einmal – Mukesh

+0

Nun, das scheint die Sammlung select zu versauen.Es zeigt eine leere Sammlung mit allen Produktnamen als einfachen Text unter der Sammlung ausgewählt auswählen –

0

Ändern Sie diese Zeile:

<%= collection_select(:product, :product_ids, Product.all, :id, 
    :product_name, 
      {:prompt => 'Please select', :multiple => true }) %> 
    </div> 

zu

<%= collection_select(:product, :product_id, Product.all, :id, 
    :product_name, 
      {:prompt => 'Please select', :multiple => true }) %> 
    </div> 
+0

Ich habe versucht, was Sie genannt haben. Es führt jedoch zu denselben Ergebnissen. Erstellt ein Herstellerprodukt mit leerer Hersteller-ID und Produkt-ID. –