Tengo dos modelos: el descuento tiene y pertenece a muchos Businsses.Cómo puedo agregar un error de validación en callbacks de asociación before_save
Quiero validar que un descuento siempre tenga al menos un negocio, junto con otra condición (por ejemplo active?
). He intentado lo siguiente:
class Discount < ActiveRecord::Base
has_and_belongs_to_many :businesses,
before_remove: :validate_publish_status
def validate_publish_status(*arg)
if active? && businesses.count == 0
errors[:active] << 'discount with no business'
end
end
end
Sin embargo, esto no funciona (no hay errores de validación criados) y me di cuenta de que esto es probablemente porque es sólo una devolución de llamada, no una validación. ¿Cómo puedo codificarlo para poder usar el errors
como lo hago con la validación personalizada?
La acción del controlador que tengo (Ajax):
def remove
@business = Business.find(params[:business_id])
if @business.in? @discount.businesses
@discount.businesses.delete(@business)
end
render json: @business.as_json(only: [:id, :type, :name, :address],
methods: [:city_name, :country_name]).
merge(paths: paths_for(@discount, @business))
rescue ActiveRecord::RecordInvalid # even tried the generic Exception
respond_to do |f|
f.json { render json: {error: $!.message}, status: 403 }
end
end
gracias, lo revisé y se ejecutó a través del método. Si 'raise' error'' aumentaría el error como se esperaba. – lulalala
Actualicé la respuesta con algo más de información. Deberá plantear una excepción en la devolución de llamada para detener la transacción. Al hacerlo, es probable que desee hacer algún manejo de excepciones en el controlador para volver a procesar la acción. – miked
También puede devolver falso para detener la ejecución. "Toda la cadena de devolución de llamada está envuelta en una transacción. Si cualquier método de devolución de llamada anterior devuelve exactamente falso o genera una excepción, la cadena de ejecución se detiene y se emite un ROLLBACK; después de las devoluciones de llamada solo puede lograr eso al generar una excepción". http://guides.rubyonrails.org/active_record_validations_callbacks.html#halting-execution – amree