Estoy usando la gema nested_form
para mi relación AddressBook
. Cuando los espacios en blanco de usuario fuera el valor de un Addr
existente, que quieren eliminar esa Addr
en lugar de guardar con un espacio en blanco value
cómo evitar guardar registros vacíos en un formulario de carriles anidados
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
Mi método :reject_if
funciona bien pero no me da todo lo que necesito
valid?
guarda mi Addrs en blanco alrededor a través de la validacióna[:id].blank?
evita rechazos cuando los espacios en blanco de usuarios fuera y registro existente
Ahora, necesito eliminar (en lugar de guardar) un Addr
existente cuando el usuario blanquea el value
. Además, estoy exponiendo Personas y Agregados a través de una API RESTful. Veo dos opciones posibles:
- proceso Deja la
params
hash para añadir el mágico_destroy=1
parámetro. IOW, emula la actividad del usuario al presionar el botón Eliminar. - Encapsule esto dentro del modelo
Addr
de modo que una actualización con unvalue
en blanco se considere efectivamente una eliminación.
Basado en el consejo aquí es como yo implementé:
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
De los dos, la opción 1. Uso Usted no quiere "mágica" como "si el valor del campo X está en blanco a continuación, eliminar el registro". – Zabba
He actualizado la pregunta con la solución que sugirió. –
@Zabba, estoy refaccionando este código 18 meses después y tenías razón. Mi idea de borrar el valor como "mágico" 'destroy_blank_addrs' fue muerte cerebral. También creo que cualquier solución que implique modificar directamente la matriz 'params' es una mala práctica. Cualquier postproceso se debe hacer después de 'assign_attributes' pero antes de' save' –