Validate:on在Rails Controller中使用自定义方法



我想对以下路由进行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时都会运行,而不是为createupdate添加特定条件。

如果出于某种原因,您希望单独添加此项。您可以添加对update运行的验证,并使用update调用或在值检查后对其调用valid?来更新实际属性,以确保记录通过验证

问题是update控制器操作没有映射到模型操作。一个是指模型生命周期中的一个端点,另一个则是指事件。查看有关验证选项的官方文档。

您可以创建自定义条件验证,以便在每次更改模型时运行。例如:

validate :validate_premium_bars, if: :allowed_chage?

def allowed_chage?
@allowed_chage
end

soruce

最新更新