2010-12-08 109 views
4

相当于<%= f.hidden_field :_destroy %>用于取消而不是销毁? (即我只是将它从协会中删除,但我不想摧毁它)。Rails嵌套模型 - 删除关联

一个例子的情况是:

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

一个小的修改,以解决

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

所以,现在我可以打电话。编辑html的:

<%= builder.hidden_field :_remove %> 

回答

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参数传递,这样你就可以实现它在形式的复选框。我希望这有帮助!

更新:我添加了一个博客贴子,介绍了有关非属性如何被用作轨道表单元素更详细,加入存​​取你的模型:

Dynamic Form Elements in Ruby on Rails

它包括一个可运行的Rails 3示例应用程序,以显示所有部分如何协同工作。

+0

您好,先生,非常有帮助。 – SooDesuNe 2010-12-08 01:08:29