【发布时间】:2020-08-06 15:16:21
【问题描述】:
我想对以下路由做一个放置/补丁,作为回报,它会调用 bar 控制器并调用它的 update_premium 方法:
put '/bar/premium', to: 'bars#update_premium'
但是,无论何时调用 .save 或 .valid?/.valid,该方法都应在模型本身中调用验证检查。
bar.rb
class Bar < ApplicationRecord
belongs_to :city
validate :validate_premium_bars, on: :create
validate :validate_premium_bars, on: :update_premium
def allow
@allow_change = true
end
private
def validate_premium_bars
return unless self.city
unless @allow_change
if self.city.bars.where(:is_premium => true).count >= 5
errors.add("...")
end
end
end
end
bars_controller.rb
def update_premium
@bar = Bar.find(params[:id])
if @bar.save
...
else
render json: @bar.errors.full_messages, status: 400
end
end
当我使用on: :update 时它可以工作,但是控制器中的自定义方法(例如on: :update_premium)不能与“on:”符号一起使用。
我该如何解决这个问题?我想将 update 方法保留在控制器中,以进行真正的完整模型更新,而不仅仅是触发模型的一个属性。
【问题讨论】:
-
如何更新
update_premium方法中的值? Rails 模型验证回调通常应该在update上调用,而不仅仅是控制器中的update方法。 -
@anonn023432 就像这样,例如:
@bar.is_premium = !@bar.is_premium
标签: ruby-on-rails ruby api validation