как избежать сохранения пустых записей во вложенной форме rails

Я использую драгоценный камень nested_formдля своего AddressBookотношения. Когда пользователь удаляет значение существующего Addr, я хочу удалить это Addr, а не сохранять с пустымvalue

class Person < ActiveRecord::Base
  has_many :addrs, dependent: :destroy
  attr_accessible :name, :addrs_attributes
  accepts_nested_attributes_for :addrs, reject_if: :addr_blank, allow_destroy: true

  def addr_blank(a)
    valid? && a[:id].blank? && a[:value].blank? 
  end

class Addr < ActiveRecord::Base
  belongs_to :person
  attr_accessible :kind, :label, :value, :person_id

Мой :reject_ifметод работает хорошо, но он не дает мне всего, что мне нужно

  1. valid?сохраняет мои пустые адреса через проверку
  2. a[:id].blank?позволяет избежать отклонений, когда пользователь пропускает и существующая запись

Теперь мне нужно удалить (, а не сохранять )существующий Addr, когда пользователь очищает value. Кроме того, я открываю Persons и Addrs через RESTful API. Я вижу два возможных варианта:

  1. После обработки хэша paramsдобавьте магический параметр _destroy=1. IOW, эмулируйте действия пользователя по нажатию кнопки удаления.
  2. Инкапсулируйте это внутри модели Addr, чтобы обновление с пустым valueэффективно считалось удалением.

Основываясь на совете, вот как я это реализовал:

люди _controller.rb

def update
  @person = Person.find(params[:id])
  @person.destroy_blank_addrs(params[:person])
  respond_to do |format|
 ...

человек.rb

def destroy_blank_addrs(person_params)
  if valid? && person_params[:addrs_attributes]
    person_params[:addrs_attributes].each do |addr_params_array|
      addr_params= addr_params_array[1] 
      addr_params[:_destroy] = '1' if !addr_params[:id].blank? && addr_params[:value].blank? 
    end
  end
end
18
задан Chris Beck 15 July 2012 в 19:39
поделиться