Запись не найдена - PullRequest
       69

Запись не найдена

5 голосов
/ 26 марта 2012

Я получаю

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 пришла от здесь , но я зарегистрировал метод, и он даже не вызывается! Неважно, как его зовут!

Ответы [ 3 ]

7 голосов
/ 26 марта 2012

Исправлена ​​проблема с перегрузкой метода client_attributes =, как описано здесь :

  def client_attributes=(client_attrs)    
    self.client = Client.find_or_initialize_by_id(client_attrs.delete(:id))
    self.client.attributes = client_attrs
  end
0 голосов
/ 12 июня 2018

Была такая же ошибка при создании новой вещи для существующей модели с has_many и own_to отношений.

Исправлена ​​ошибка путем добавления скрытого поля для идентификаторасуществующей модели, например, User, в форму.

= form.input :user_id, as: :hidden

Затем новая вещь была создана без ошибки.

0 голосов
/ 26 июля 2017

Если вы хотите только новый заказ с существующим клиентом, без изменения клиента, вам нужно назначить идентификатор.

Order.new(client_id: 3)

Это еще один способ сделать это без перегрузки метода client_attributes= и очистить

Новый заказ теперь имеет клиента с идентификатором 3

Если вы такжеЧтобы обновить атрибуты ant клиента, вы должны добавить client_attributes, например:

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