2017-04-25 3 views
1

Ich versuche, eine Rails button_to zu verwenden, um eine neue Instanz in meiner Join-Tabelle zu erstellen.Erstellen einer neuen has_many durch Instanz mit button_to

Ich habe 4 Modelle (Hersteller, Chargen, Angebote und Großhändler) - Hersteller hat viele Chargen, Chargen has_many Angebote und has_many Großhändler durch Angebote. Großhändler hat viele Angebote und hat viele Lose durch Angebote.

Ich richte die 'neue Angebote' Ansicht innerhalb einer bestimmten Charge ein, um eine Liste aller Großhändler zu sein, so dass der Hersteller auf einen Knopf neben einem einzelnen Großhändler klicken kann, der ein neues 'Angebot' erstellen wird Charge und der spezifische Großhändler.

<%= button_to '+', {:controller => "offers", :action => "create", :wholesaler_id => wholesaler.id}, :method=>:post %> 

meine Methode in der Angebote Controller erstellen:

def create 
    @offer = Offer.new(offer_params) 

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

Meine offer_params Methode im Angebot Controller:

def offer_params 
    params.require(:offer).permit(:batch_id, :wholesaler_id, :amount, :accepted, :ignored) 
end 

Ich erhalte eine Fehlermeldung, wenn ich versuche, und klicken Sie auf das Add Taste -

ActionController::ParameterMissing in OffersController#create 
param is missing or the value is empty: offer 

bezieht sich auf die Methode offer_params.

Da ich das Angebot erst erstellt habe, nachdem ich auf den Button geklickt habe weiß ich nicht wie/wo ich darauf verweisen kann.

Vielen Dank für jede Hilfe - glücklich, jeden zusätzlichen Code zu posten, der bei der Beantwortung nützlich sein könnte.

Full 'neue' Ansicht:

<div id="wrapper"> 
    <div id="unselected"> 
    <h2> Wholesalers</h2> 
    <table> 
     <thead> 
     <tr> 
     <th> Wholesaler </th> 
     <th> Add</th> 
     </tr> 
     </thead> 
     <tbody> 
     <% @unselected_wholesalers.each do |wholesaler| %> 
      <tr> 
      <td><%=wholesaler.name %></td> 
      <td><%= button_to '+', 
           {:controller => "offers", :action => "create", 
           :wholesaler_id => wholesaler.id}, 
           :method=>:post %></td> 
      </tr> 
     <% end %> 
     </tbody> 
    </table> 
    </div> 
</div> 
<%= link_to 'Back', manufacturer_batches_path(@manufacturer) %> 
+0

könnten Sie bitte 'offer' Form, die Ihr send mit Knopf befestigen? – idej

+0

Ich bin mir nicht sicher, was Sie mit dem Angebotsformular meinen? Ich benutze keine Form teilweise, ich habe gerade den Code in der neuen Angebote Ansicht - Ich habe den vollständigen Code für diese Ansicht in meinem Beitrag –

Antwort

0

Wegen der require Anweisung, offer_params ein Objekt offer enthält den Schlüssel batch_id, wholesaler_id usw. genannt erwartet, die wie folgt aussehen:

{ 
    offer: { 
     batch_id, 
     wholesaler_id, 
     amount, 
     etc. 
    } 
} 

Aber es sieht so aus, als würde Ihr button_to folgendes senden:

{ 
    batch_id, 
    wholesaler_id, 
    amount, 
    etc. 
} 

wäre die einfachste Lösung, um die require Anweisung entfernen sein, erhalten Sie eine offer_params wie diese geben:

def offer_params 
    params.permit(:batch_id, :wholesaler_id, :amount, :accepted, :ignored) 
end 
+1

Vielen Dank! Das hat funktioniert, also habe ich die required in der folgenden Taste geändert: '<% = button_to' + ', {: controller => "Angebote",: action => "create",: offer => { : batch_id => @ batch.id,: großhändler_id => großhändler.id}},: method =>: post%> ' –

Verwandte Themen