4

<%= f.hidden_field :_destroy %>破壊する代わりに無効化することと同等のものは何ですか? (つまり、関連付けから削除するだけでしたが、破棄したくありません)。

状況の例は次のとおりです。

class Foo < ActiveRecord::Base
  has_many :bar, :dependent=>:nullify, :autosave=>true
  accepts_nested_attributes_for :bar, :reject_if => proc { |attributes| attributes.all? {|k,v| v.blank?} }


class Bar < ActiveRecord::Base
  belongs_to :foo

Foo's でedit.html.erb:

<%= f.fields_for :bar do |builder| %>
   <%= builder.some_rails_helper %>
   <%= builder.hidden_field :_remove  #<-- set value to 1 to destroy, but how to unassociate?%> 
<% end %>

ソリューションへの 1 つの小さな変更

def remove
  #!self.foo_id.nil? should be:
  false #this way newly created objects aren't destroyed, and neither are existing ones.
end

これで、.edit.html を呼び出すことができます。

<%= builder.hidden_field :_remove %>
4

1 に答える 1

6

次のようなメソッドを作成します。

class Bar
  def nullify!
    update_attribute :foo_id, nil
  end
end

これで、任意のバー インスタンスでそれを呼び出すことができます。あなたの例に合うようにするには、次のようにします。

def remove
  !self.foo_id.nil?
end

def remove= bool
  update_attribute :foo_id, nil if bool
end

このバージョンでは、true または false に相当するパラメーターを渡すことができるため、フォームのチェックボックスとして実装できます。これが役立つことを願っています!

更新:モデルにアクセサーを追加することにより、非属性をレールのフォーム要素として使用する方法について詳しく説明するブログ投稿を追加しました。

Ruby on Rails の動的フォーム要素

すべてのパーツがどのように連携するかを示すために、Rails 3 サンプル アプリが動作します。

于 2010-12-08T00:17:18.380 に答える