0

Ich habe gekämpft, um meine verschachtelte Form zu erhalten, um die Eingaben der Benutzer zu speichern. Die "äußere" Form speichert die Information perfekt. Der "innere", oder verschachtelte, erstellt ein neues Objekt und übergibt versteckte Feldinformationen, aber alle anderen Werte sind "Null".Rails - Nested Forms erstellt, aber Informationen werden nicht gespeichert

Jede Bestellung hat einen oder mehrere date_orders, und Sie sollten die erste über dieses Formular erstellen können.

Mein Code folgt. Bitte helfen Sie mir, etwas zu finden, das das verursachen könnte. Ich habe StackOverflow ausführlich besucht.

orders_controller.rb

class OrdersController < ApplicationController 

def new 
    @order = Order.new 
    @order.date_orders.build 
end 

def create 
    @order = Order.new(order_params) 
    @order.date_orders.build 
    if @order.save 
     flash[:success] = "Success" 
     redirect_to current_user 
    else 
     render 'new' 
    end 
end 

def order_params 
    params.require(:order).permit(
     :user_id, :description, date_order_attributes: 
      [:id, :order_date, :time_start, :time_end, :order_id]) 
end 
end 

order.rb

class Order < ActiveRecord::Base 
    has_many :date_orders, :dependent => :destroy 
    accepts_nested_attributes_for :date_orders 
end 

date_order.rb

class DateOrder < ActiveRecord::Base 
    belongs_to :order 
end 

routes.rb -> date_orders ist in den Routen nicht erwähnt. Ist das ein Problem?

Aufträge/new.html.erb

<%= form_for(@order, :html => {:multipart => true}) do |f| %> 
<!-- form_for fields FIELDS --> 
<%= fields_for :date_orders do |builder| %> 

    <%= builder.hidden_field :order_id, :value => @order.id %> <- THIS WORKS 

    <%= builder.label :date %> 
    <%= builder.date_field :order_date %> 

    <%= builder.label :starting_time %> 
    <%= builder.time_field :time_start %> 

    <%= builder.label :ending_time %> 
    <%= builder.time_field :time_end %> 


<% end %> 
<%= f.submit "Request", class: "btn" %> 
<% end %> 

EDIT: Beispiel für einen Hash, der erstellt wird:

<DateOrder id: 9, order_date: nil, time_start: nil, time_end: nil, order_id: 29, created_at: "2016-04-29 22:43:18", updated_at: "2016-04-29 22:43:18">enter code here` 
+1

'@ order.date_orders.build' in der' # create' Aktion ist nicht notwendig. Es erstellt ein neues Objekt von Grund auf, was nicht das ist, was Sie wollen - Sie möchten nur die Benutzereingaben speichern.Können Sie hier ein Beispiel für den 'params'-Hash einfügen, den die' # create'-Aktion nach dem Senden in der UI-Eingabe empfängt, die für Sie nicht richtig funktioniert? – AmitA

+0

Außerdem benötigen Sie das versteckte Feld nicht. – AmitA

+1

Oh, Sie haben einen Tippfehler in der "Genehmigung". Es sollte "date_orders_attributes" im Plural sein. Bitte schauen Sie sich das Serverprotokoll an 'rails s' spuckt aus - alle nicht erlaubten Attribute sollten eine Warnung erhalten. Stellen Sie sicher, dass Sie keine haben. – AmitA

Antwort

1

ein paar Gedanken darüber, wie diese Art von Problemen zu debuggen:

  1. Werfen Sie einen Blick auf die Serverprotokolle (das Terminalfenster, in dem Sie rails s ausgeführt haben). Wenn starke Parameter permit nicht erlaubte Attribute fallen lassen, wird dort eine Warnung angezeigt. Stellen Sie sicher, dass Sie keine Tippfehler haben, wie in Ihrem Fall (mit date_order_attributes anstelle von date_orders_attributes).
  2. Senden Formulareingabe in der Benutzeroberfläche, die nicht funktioniert, werfen Sie einen Blick auf die Serverprotokolle und finden Sie die params Hash gesendet wird. Sie können dann Ihren Code debuggen, indem Sie einfach zur Konsole gehen und die relevanten Schlüssel aus dem Params-Hash einfügen, den Sie an Order.new senden. Z.B .: Order.new(params['order'])

Einige Änderungen, die ich in Ihrem Code machen würde:

  1. entfernen @order.date_orders.build aus der #create Aktion. Dies ist nützlich für #new, um eine leere Datumsreihenfolge anzuzeigen, aber nicht in #create, wo Sie vollständig auf die Benutzereingabe verlassen möchten.
  2. Entfernen <%= builder.hidden_field :order_id, :value => @order.id %>. Schienen braucht es nicht. Wenn Sie rails accepts_nested_attributes_for :date_orders angaben, fügte es Ihrem Modell einfach eine Standardmethode date_orders_attributes= hinzu. Wenn Sie einen Hash senden, der wie hash = {order_title: 'my_title', date_orders_attributes: {order_date: '...'}} zu Order.new(hash) aussieht, sendet ActiveRecord den date_orders_attributes-Teil des Hash an die Methode auf dieser neu erstellten Bestellinstanz. Das heißt, diese Methode weiß bereits, dass Ihre untergeordneten Datumsangaben zur Bestellinstanz gehören, sodass sie nicht erforderlich sind.