私は2つのモデルを持っています:割引は多くのBusinssesに属しています。before_saveアソシエーションコールバックで検証エラーを追加する方法
割引は、少なくとも1つのビジネスと、別の条件(たとえば、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
を使用できますか?
(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
ありがとう、私はチェックしたし、メソッドを実行しました。私が ''エラー 'を発生させるなら、それは予想どおりにエラーを発生させるでしょう。 – lulalala
私はいくつかの情報で答えを更新しました。トランザクションを停止するには、コールバックで例外を発生させます。これを行うには、おそらくコントローラで何らかの例外処理を行い、アクションを再レンダリングしたいと思うでしょう。 – miked
また、falseを返して実行を停止することもできます。すべてのコールバック・チェーンがトランザクションでラップされています。コールバック・メソッドが正確にfalseを戻すか、例外を発生させると、実行チェーンが停止し、ROLLBACKが発行されます。 http://guides.rubyonrails.org/active_record_validations_callbacks.html#halting-execution – amree