2010-12-08 12 views
4

破棄するのではなく無効化するために<%= f.hidden_field :_destroy %>と同等の機能はありますか? (つまり、私は関連から削除することでしたが、削除したくありません)。Railsネストされたモデル - アソシエーションを削除する

例の状況は次のようになります。

のFooさん edit.html.erb
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 

<%= 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 %> 

一つの解決策に小さな変更

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を:

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

そして今、あなたはどのバーインスタンス上でそれを呼び出すことができます。

<%= builder.hidden_field :_remove %> 

答えて

6

は、このようなメソッドを作成します。それはあなたの例を収まるようにするには、この操作を行うことができます:

def remove 
    !self.foo_id.nil? 
end 

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

このバージョンでは、trueまたはfalseに相当するパラメータに渡すことができますので、あなたは、フォームのチェックボックスとしてそれを実装することができます。私はこれが助けて欲しい!

UPDATE:私は非属性がモデルにアクセサを追加することにより、レールにフォーム要素として使用する方法についての詳細に入るのブログ記事を追加しました:

Dynamic Form Elements in Ruby on Rails

これは、すべての部品がどのように連携して動作するかを示すRails 3サンプルアプリケーションを含んでいます。

+0

あなたはとても役に立ちます。 – SooDesuNe

関連する問題