Używam klejnotu nested_form
dla mojej relacji AddressBook
. Kiedy wykroje użytkownika z wartości istniejącego Addr
, chcę usunąć Addr
że zamiast oszczędności z pustym value
jak uniknąć zapisywania pustych rekordów na szynie zagnieżdżonej formularz
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
My :reject_if
metoda działa dobrze, ale to nie daje mi wszystko, czego potrzebuję
valid?
utrzymuje moje puste Addrs wokół poprzez walidacjęa[:id].blank?
uniknięcie odrzucenia, gdy użytkownik wychodzi i wykroje istniejący rekord
Teraz muszę usunąć (a nie zapisać) istniejący Addr
, gdy użytkownik opróżnia numer value
. Ponadto udostępniam osoby i dodatki za pośrednictwem interfejsu API RESTful. Widzę dwie możliwe opcje:
- procesu POST
params
skrótu, aby dodać magiczną_destroy=1
param. IOW, emuluje aktywność użytkownika polegającą na naciśnięciu przycisku kasowania. - Zawiera to wewnątrz modelu
Addr
, tak że aktualizacja pustąvalue
jest skutecznie uznawana za usunięcie.
oparciu o poradę Oto jak I wdrożone go:
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
Z tych dwóch, użyj opcji 1. Nie chcesz „magię” jak „jeżeli wartość X pole jest puste, a następnie usunąć rekord”. – Zabba
Zaktualizowałem pytanie, proponując rozwiązanie. –
@Zabba, przebudowuję ten kod 18 miesięcy później i miałeś rację. Mój pomysł zatarcia wartości jako "magicznego" 'destroy_blank_addrs' był martwy mózg. Wierzę również, że każde rozwiązanie, które wymaga bezpośredniej modyfikacji tablicy 'params'ów jest złą praktyką. Wszelkie przetwarzanie powinno być wykonywane po 'assign_attributes', ale przed' save' –