我想对以下路由进行put/patch,该路由反过来调用bars控制器并调用其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
它在我使用CCD_ 4时工作,然而控制器中的自定义方法(例如CCD_;关于:";象征
我该如何解决此问题?我想在控制器中保留更新方法,以便进行真正的完整模型更新,而不仅仅是触发模型的一个属性。
考虑到这个问题中的情况,我实际上建议将验证添加为:
validate :validate_premium_bars
因此,它在每次运行valid?
或save
时都会运行,而不是为create
和update
添加特定条件。
如果出于某种原因,您希望单独添加此项。您可以添加对update
运行的验证,并使用update
调用或在值检查后对其调用valid?
来更新实际属性,以确保记录通过验证
问题是update
控制器操作没有映射到模型操作。一个是指模型生命周期中的一个端点,另一个则是指事件。查看有关验证选项的官方文档。
您可以创建自定义条件验证,以便在每次更改模型时运行。例如:
validate :validate_premium_bars, if: :allowed_chage?
def allowed_chage?
@allowed_chage
end
soruce