2012-03-25 22 views
5

मैंRecordNotFound और belongs_to

ActiveRecord :: RecordNotFound: नहीं आईडी के साथ आदेश के लिए आईडी = 3 के साथ ग्राहक मिल सका =

जब एक के लिए एक आदेश प्रपत्र प्रस्तुत करने के लिए कोशिश कर रहा मौजूदा ग्राहक

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 

reject_if विचार आया यह फार्म या लिखकर कंसोल के माध्यम से होता है here से लेकिन मैंने विधि को लॉग किया और इसे भी बुलाया नहीं जा रहा है! इससे कोई फर्क नहीं पड़ता कि इसका नाम क्या है!

उत्तर

7

, client_attributes = विधि ओवरलोडिंग से समस्या का समाधान किया के रूप में वर्णित here:

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

इस अंत नहीं है, भले ही यह आईडी से एक ग्राहक पाता है एक और ग्राहक बनाने? – dubilla

0

आप केवल एक मौजूदा ग्राहक के साथ एक नया आदेश चाहते हैं, ग्राहक को संशोधित किए बिना, आप आईडी सौंपने होंगे।

Order.new(client_id: 3) 

यह एक और तरीका client_attributes= विधि और साफ

नया आदेश अब आईडी के साथ ग्राहक है अधिक भार के बिना यह करने के लिए है 3

आप भी चींटी ग्राहक की विशेषताओं चीज़ें आवश्यक अपडेट करना चाहते हैं client_attributes जोड़ने के लिए, उदाहरण के लिए:

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