对于nullify而不是销毁,相当于<%= 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的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
所以现在我可以打电话给.edit.html:
<%= builder.hidden_field :_remove %>
答案 0 :(得分:6)
创建一个这样的方法:
class Bar
def nullify!
update_attribute :foo_id, nil
end
end
现在你可以在任何一个bar实例上调用它。为了使它适合您的示例,您可以这样做:
def remove
!self.foo_id.nil?
end
def remove= bool
update_attribute :foo_id, nil if bool
end
此版本将允许您传入等于true或false的参数,因此您可以将其实现为表单中的复选框。我希望这有帮助!
更新:我添加了一篇博文,详细介绍了如何通过向模型中添加访问器,将非属性用作rails中的表单元素:
Dynamic Form Elements in Ruby on Rails
它包含一个工作的Rails 3示例应用程序,以显示所有部分如何协同工作。