Я использую драгоценный камень 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
метод работает хорошо, но он не дает мне всего, что мне нужно
valid?
сохраняет мои пустые адреса через проверкуa[:id].blank?
позволяет избежать отклонений, когда пользователь пропускает и существующая записьТеперь мне нужно удалить (, а не сохранять )существующий Addr
, когда пользователь очищает value
. Кроме того, я открываю Persons и Addrs через RESTful API. Я вижу два возможных варианта:
params
добавьте магический параметр _destroy=1
. IOW, эмулируйте действия пользователя по нажатию кнопки удаления.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