我有兩種模式:折扣具有並屬於多個總線。如何在before_save關聯回調中添加驗證錯誤
我想驗證一個折扣總是有至少一個業務以及另一個條件(例如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
但是這不工作(沒有提出驗證錯誤),我意識到,這可能是因爲它僅僅是一個回調,而不是驗證。我如何編碼,以便像我自定義驗證一樣使用errors
?
控制器動作我有(阿賈克斯):
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
謝謝,我沒有檢查,它通過該方法。如果我'提出'錯誤',它會按預期提高錯誤率。 – lulalala 2012-01-31 01:33:26
我用更多的信息更新了答案。您需要在回調中引發異常來停止交易。爲此,您可能需要在控制器中執行一些異常處理以重新呈現操作。 – miked 2012-01-31 01:56:38
您也可以返回false來暫停執行。 「整個回調鏈都被包裝在一個事務中,如果在回調方法返回完全爲false或引發異常之後,執行鏈會暫停併發出ROLLBACK;回調只能通過引發異常來完成。 http://guides.rubyonrails.org/active_record_validations_callbacks.html#halting-execution – amree 2012-01-31 01:59:18