gpt4 book ai didi

ruby-on-rails - 如何在 before_save 关联回调中添加验证错误

转载 作者:行者123 更新时间:2023-12-03 00:50:08 34 4
gpt4 key购买 nike

我有两个模型:折扣拥有且属于许多企业。

我想验证折扣始终至少有一项业务,以及另一个条件(例如有效?)。我尝试了以下方法:

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

但是这不起作用(没有引发验证错误),我意识到这可能是因为它只是一个回调,而不是验证。我该如何编码才能像自定义验证一样使用错误

我的 Controller 操作(用于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

最佳答案

可能是您的 before_remove 回调语法或验证方法本身发生的情况。您可能还想在回调方法中添加一些调试代码,以查看它是否在那里运行。

*请注意,只有在回调方法中引发异常时,事务才会停止。既然是这种情况,您可能需要处理 Controller 中的异常逻辑以重新呈现操作:

class Discount < ActiveRecord::Base
has_and_belongs_to_many :businesses, :before_remove => :validate_publish_status

def validate_publish_status(*args)
if yyy? && businesses.count == 0
errors.add(:yyy,'discount with no business')
raise "Unable to remove business."
end
end

end

Controller 要点:

  def update
@company.find(params[:id])
if @company.update_attributes(params[:company])
...
else
render :action => 'edit'
end
rescue
render :action=>'edit'
end

注意 Association Callback Documentation.

关于ruby-on-rails - 如何在 before_save 关联回调中添加验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9061569/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com