2012-03-25 7 views
5

ichRecordNotFound mit accepts_nested_attributes_for und belongs_to

Active :: RecordNotFound: Kann nicht-Client mit ID = 3 für den Auftrag mit ID finden =

beim Versuch, eine Bestellformular für ein vorlegen bestehender Kunde. Dies geschieht durch die Form oder die Konsole eingeben:

Order.new(:client_attributes => { :id => 3 }) 

payment_form.html.erb:

<%= semantic_form_for @order, :url => checkout_purchase_url(:secure => true) do |f| %> 

     <%= f.inputs "Personal Information" do %> 

      <%= f.semantic_fields_for :client do |ff| %> 
       <%= ff.input :first_name %> 
       <%= ff.input :last_name %>    
       <!-- looks like semantic_fields_for auto-inserts a hidden field for client ID --> 
      <% end %> 

     <% end %> 
<% end %> 

Order.rb:

class Order < ActiveRecord::Base 
    belongs_to :client 
    accepts_nested_attributes_for :client, :reject_if => :check_client 

    def check_client(client_attr) 
    if _client = Client.find(client_attr['id']) 
     self.client = _client 
     return true 
    else 
     return false 
    end  
    end 
end 

Die reject_if Idee kam von here, aber ich habe die Methode protokolliert und es wird nicht einmal aufgerufen! Es ist egal, wie er heißt!

Antwort

7

das Problem wird behoben, durch die client_attributes = Methode Überlastung, wie here beschrieben:

def client_attributes=(client_attrs)  
    self.client = Client.find_or_initialize_by_id(client_attrs.delete(:id)) 
    self.client.attributes = client_attrs 
    end 
+0

Erstellt dies nicht noch einen anderen Client erstellen, auch wenn es einen Client durch ID findet? – dubilla

0

Wenn Sie nur einen neuen Auftrag mit einem vorhandenen Client wollen, ohne den Client zu modifizieren, müssen Sie die ID zuweisen.

Order.new(client_id: 3) 

Dies ist ein weiterer Weg, um dies die client_attributes= Methode und saubersten

Der neue Bestellen Sie jetzt den Client mit ID ohne Überlastung zu tun, 3

Wenn Sie ant Client Attribute wollen auch müssen Sie aktualisieren hat fügen Sie die client_attributes, zum Beispiel:

Order.new(client_id: 3, client_attributes: { id: 3, last_order_at: Time.current })