2010-12-08 2 views
4

Was entspricht <%= f.hidden_field :_destroy %> für nullify anstatt zu zerstören? (Ich wollte es nur aus der Assoziation entfernen, aber ich will es nicht zerstören).Rails verschachteltes Modell - Verbindung entfernen

wäre ein Beispiel Situation:

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 

In Foo 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 %> 

Eine kleine Änderung an der Lösung

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

So, jetzt kann ich anrufen in .bearbeiten .html:

<%= builder.hidden_field :_remove %> 

Antwort

6

Erstellen Sie eine Methode wie folgt aus:

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

Und jetzt können Sie, dass an jeder Bar-Instanz aufrufen. Um es Ihrem Beispiel fit zu machen, können Sie dies tun:

def remove 
    !self.foo_id.nil? 
end 

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

Diese Version lässt Sie in einem Parameter übergeben, die wahr oder falsch entspricht, so können Sie es als eine Checkbox in Formen umzusetzen. Ich hoffe das hilft!

UPDATE: Ich habe einen Blog-Beitrag hinzugefügt, die mehr ins Detail geht, wie nicht-Attribute können als Formelemente in Schienen verwendet werden, indem Accessoren zu Ihrem Modell hinzu:

Dynamic Form Elements in Ruby on Rails

Es enthält eine funktionierende Rails 3 Beispiel-App, um zu zeigen, wie alle Teile zusammenarbeiten.

+0

Sie, Sir, sind sehr hilfreich. – SooDesuNe