2010-12-08 3 views
4

Что эквивалентно <%= f.hidden_field :_destroy %> для уничтожения вместо уничтожения? (я просто должен был удалить его из ассоциации, но я не хочу его уничтожать).Rails Nested Model - Remove Association

Пример ситуации будет:

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 

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

Одно небольшое изменение в раствор

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 

Эта версия позволит вам передать в качестве параметра, который приравнивает к истинным или ложным, так что вы можете реализовать его в виде флажка в формах. Надеюсь, это поможет!

UPDATE: Я добавил сообщение в блоге, который идет более подробно о том, как не-атрибуты могут быть использованы в качестве элементов формы в рельсах, путем добавления аксессоров к модели:

Dynamic Form Elements in Ruby on Rails

Он включает в себя рабочее приложение Rails 3 для демонстрации того, как все части работают вместе.

+0

Вы, сэр, очень полезны. – SooDesuNe 2010-12-08 01:08:29