Я использую nested_form
gem для моего отношения 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?
хранит мои пустые Addrs через проверку. -
a[:id].blank?
избегает отклонений, когда пользователь выполняет пропуски и существующую запись
Теперь мне нужно удалить (а не сохранить) существующий Addr
, когда пользователь закроет value
. Кроме того, я подвергаю людей и Addrs через RESTful API. Я вижу два возможных варианта:
- Запустите процесс хеша
params
, чтобы добавить магический параметр_destroy=1
. IOW, эмулирует активность пользователя при нажатии кнопки удаления. - Инкапсулируйте это внутри модели
Addr
, так что обновление с пустойvalue
эффективно считается удалением.
Основываясь на совете, вот как я его реализовал:
people_controller.rb
def update
@person = Person.find(params[:id])
@person.destroy_blank_addrs(params[:person])
respond_to do |format|
...
person.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