2010-12-08 7 views
4

Quel est l'équivalent de <%= f.hidden_field :_destroy %> pour annuler au lieu de détruire? (c'est-à-dire que je voulais simplement le retirer de l'association, mais je ne veux pas le détruire).Rails Modèle imbriqué - Supprimer l'association

Une situation exemple serait:

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 

Dans edit.html.erb 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 %> 

Une petite modification à la solution

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

Alors maintenant, je peux appeler .modifier .html:

<%= builder.hidden_field :_remove %> 

Répondre

6

Créer une méthode comme ceci:

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

Et maintenant, vous pouvez appeler sur une instance de bar. Pour l'adapter à votre exemple, vous pouvez faire ceci:

def remove 
    !self.foo_id.nil? 
end 

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

Cette version vous permettra de passer dans un paramètre qui équivaut à vrai ou faux, de sorte que vous pouvez l'appliquer comme une case à cocher dans les formes. J'espère que ça aide!

MISE À JOUR: J'ai ajouté un billet de blog qui va plus en détail sur la façon dont les non-attributs peuvent être utilisés comme éléments de forme dans les rails, en ajoutant accesseurs à votre modèle:

Dynamic Form Elements in Ruby on Rails

Il comprend un exemple d'application Rails 3 pour montrer comment toutes les pièces fonctionnent ensemble.

+0

Monsieur, vous êtes extrêmement utile. – SooDesuNe

Questions connexes