0

コードは次のとおりです。

class Client < ActiveRecord::Base
  ...
  has_one :offer, :dependent => :destroy
  accepts_nested_attributes_for :offer
  ...
end

class Offer < ActiveRecord::Base
  ...
  belongs_to :client
  ...
end


<%= simple_form_for [:admin, @client], :html=>  {:multipart => true } do |f| %>
..some input fields
<%= f.simple_fields_for :offer, @client.new_record? ? Offer.new : ""  do |o| %>
..some input fields

これは新しいエントリに対して機能しますが、更新されません。

エラー: Mysql2::エラー: 列 'offers' が不明です。「WHERE 句」: DELETE FROM offersWHERE offers.`` = 718

クライアントモデルを次のように変更すると:

accepts_nested_attributes_for :offer, :reject_if => lambda {|a| a[:name].blank?}

エラー メッセージは表示されなくなりました。クライアント テーブルは更新されますが、オファー テーブルは更新されません。

これは機能しています:

  has_one :offer, :dependent => :destroy
  accepts_nested_attributes_for :offer, allow_destroy: true

  belongs_to :client

  <%= f.simple_fields_for :offer, @client.new_record? ? Offer.new : @client.offer  do |o| %>
4

1 に答える 1

1

まず、あなたがやっているときのように、更新には機能しないことは論理的に思えます:

<%= f.simple_fields_for :offer, @client.new_record? ? Offer.new : ""  do |o| %>

シンプルなフィールドは "" のフィールドを作成しようとしますが、オファー オブジェクトを使用する必要があります。あなたはそれを修正することができます(これを行うためのより良い方法があるかもしれません、これは単なる解決策であり、THE解決策ではありません)

<%= f.simple_fields_for :offer, @client.offer.new_record? ? Offer.new : @client.offer  do |o| %>

編集:オファーが存在しない場合にのみオファーを構築する方が良いと思うので、ここでは次のようになります。

<% @client.build_offer if @client.offer.new_record? %>
<%= f.simple_fields_for :offer do |o| %>
于 2012-10-17T20:38:27.750 に答える