İki modelim var: İndirim birçok Businsses'e ait ve aittir.Before_save ilişkilendirme geri bildirimleri içinde bir doğrulama hatası nasıl ekleyebilirim
Bir İndirim'in her zaman başka bir koşulla birlikte en az bir işletmeye sahip olduğunu doğrulamak istiyorum (örneğin active?
).
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
Ancak bu (hiçbir doğrulama hataları kaldırdı) çalışmıyor ve bunu sadece bir geri çağırma değil, bir doğrulama olduğundan bu muhtemelen fark: Aşağıdaki çalıştı. Nasıl kodlayabilirim, ben errors
'u özel doğrulama gibi yapabilirim?
(ajax) Ben kontrolör eylemi:
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
Teşekkürler, kontrol ettim ve yöntemden geçti. Eğer 'hatayı' yükseltirsem, hatayı beklendiği gibi yükseltirdi. – lulalala
Cevabı daha fazla bilgi ile güncelledim. İşlemi durdurmak için geri aramada bir istisna oluşturmak isteyeceksiniz. Bunu yaparken, eylemi yeniden oluşturmak için kontrolörde bazı istisna işlemleri yapmak isteyeceksiniz. – miked
Yürütmeyi durdurmak için false de döndürebilirsiniz. "Geridönüşüm zincirinin tamamı bir işleme sarılır. Geri arama yönteminden herhangi biri tam olarak yanlış olanı döndürürse veya bir istisnayı artırırsa, yürütme zinciri durdurulur ve geri dönüşler yalnızca bir istisna oluşturarak başarılabildiğinde bir ROLLBACK verilir." http://guides.rubyonrails.org/active_record_validations_callbacks.html#halting-execution – amree