Ruby on rails 验证:使用Rails控制器中的自定义方法打开
我想对以下路径执行put/patch,该路径反过来调用bars控制器并调用其update_premium方法:Ruby on rails 验证:使用Rails控制器中的自定义方法打开,ruby-on-rails,ruby,api,validation,Ruby On Rails,Ruby,Api,Validation,我想对以下路径执行put/patch,该路径反过来调用bars控制器并调用其update_premium方法: put'/bar/premium',to:'bar#update_premium' 但是,每当调用.save或.valid?/.valid时,该方法应在模型本身中调用验证检查 bar.rb class Bar < ApplicationRecord belongs_to :city validate :validate_premium_bars, on: :cre
put'/bar/premium',to:'bar#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
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\u premium
不能与“on:”符号一起工作
我如何解决这个问题?我希望将更新方法保留在控制器中,以便进行真正的完整模型更新,而不仅仅是触发模型的一个属性。问题在于,
更新
控制器操作没有映射到模型操作。一个是指端点,另一个是指模型生命周期中的事件。
查看有关验证选项的详细信息
您可以创建自定义条件验证,以便在每次更改模型时运行。例如:
validate :validate_premium_bars, if: :allowed_chage?
def allowed_chage?
@allowed_chage
end
考虑到这个问题的情况,我建议只添加验证,如下所示:
validate:validate\u premium\u条
因此,每次运行valid?
或save
时,它都会运行,而不是为create
和update
添加特定条件
在这种情况下,出于某种原因,您希望单独添加此项。在值检查后,您可以添加要为
update
运行的验证,并使用update
调用或调用valid?
来更新实际属性,以确保记录通过验证如何更新update\u premium
方法中的值?Rails模型验证回调一般应该在update
上调用,而不仅仅是控制器中的update
方法。@anon023432就像这样,例如:@bar.is_premium=@bar.is_premium
谢谢,这确实是解决我问题最明显、最简单的方法。