Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 验证:使用Rails控制器中的自定义方法打开_Ruby On Rails_Ruby_Api_Validation - Fatal编程技术网

Ruby on rails 验证:使用Rails控制器中的自定义方法打开

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/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: :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
谢谢,这确实是解决我问题最明显、最简单的方法。