2012-03-25 24 views
5

tôi nhận đượcRecordNotFound với accepts_nested_attributes_for và belongs_to

ActiveRecord :: RecordNotFound: Không thể tìm thấy khách hàng với ID = 3 cho thứ tự với ID =

khi cố gắng để gửi biểu mẫu theo thứ tự cho một khách hàng hiện tại. Điều này xảy ra thông qua hình thức hoặc điều khiển bằng cách gõ:

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 

Ý tưởng reject_if đến từ here nhưng tôi đã đăng nhập phương thức và thậm chí nó không được gọi! Nó không quan trọng tên của nó là gì!

Trả lời

7

Cố định vấn đề bằng cách làm quá tải các client_attributes = phương pháp, như mô tả 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

Điều này không tạo ra một Ứng dụng khách khác ngay cả khi nó tìm thấy khách hàng theo id? – dubilla

0

Nếu bạn chỉ muốn một thứ tự mới với một khách hàng hiện có, mà không sửa đổi các khách hàng, bạn cần phải gán id.

Order.new(client_id: 3) 

Đây là một cách khác để làm điều này mà không quá tải client_attributes= phương pháp và sạch

Order mới bây giờ có khách hàng với ID 3

Nếu bạn cũng muốn cập nhật các thuộc tính kiến ​​của khách hàng bạn phải thêm số client_attributes, ví dụ:

Order.new(client_id: 3, client_attributes: { id: 3, last_order_at: Time.current }) 
Các vấn đề liên quan