Ruby on rails Rails运行特定控制器方法的验证

Ruby on rails Rails运行特定控制器方法的验证,ruby-on-rails,Ruby On Rails,在仅API模式下运行Rails 5.2.3 我有一个Questions模型,它有一个disabled标志,我通过补丁更新它。我调用的特定方法的名称空间如下:v1/custom_questions/questions#disable。我的问题模型还有另一个布尔值,标准 现在在应用程序中,我有5个标准问题,即他们的standard字段是true。我还有一些功能,允许用户创建自己的问题,默认情况下,这些问题都有standard:false。我想让用户禁用他们的自定义问题,但我不想让他们禁用标准问题 我

在仅API模式下运行Rails 5.2.3

我有一个
Questions
模型,它有一个
disabled
标志,我通过补丁更新它。我调用的特定方法的名称空间如下:
v1/custom_questions/questions#disable
。我的
问题
模型还有另一个布尔值,
标准

现在在应用程序中,我有5个标准问题,即他们的
standard
字段是
true
。我还有一些功能,允许用户创建自己的问题,默认情况下,这些问题都有
standard:false
。我想让用户禁用他们的自定义问题,但我不想让他们禁用标准问题

我如何设置每当API收到检查所提供问题是否为标准问题的补丁
/disable
请求时运行的验证?我知道我可以使用
validates:validation\u方法,on::create
,但我不确定如何写出来,以便在调用
V1::CustomQuestions::QuestionsController
下的
disable
方法时触发它

我目前在控制器中有此逻辑,但我更愿意将其移动到模型验证,以便在提供的ID属于标准问题时填充
@question.errors

#问题#控制器
类问题控制器<应用程序控制器
def禁用
@question=question.find(参数[:id])
如果@question.standard?
返回
其他的
@问题1.disabled=true
结束
如果@question.save
呈现json:@question
其他的
呈现json:@question.errors,状态::请求错误
结束
结束
结束
我已尝试执行以下操作,但是
@question.save
检查似乎覆盖了我手动创建的任何错误

if@question.standard?

@问题.错误[:标准]当前的结构是导致这种情况的罪魁祸首。验证的责任应该在模型内部,而不是外部。否则,一个消费者(本例中为QuestionController)可能会进行某种验证,而另一个消费者可能会完全跳过验证

您可以尝试以下代码段,看看这是否适合您

class QuestionsController < ApplicationController

  def disable
    @question = Question.find(params[:id])

    @question.disabled = true

    if @question.save
      render json: @question
    else
      render json: @question.errors, status: :bad_request
    end
  end
end


class Question < ApplicationRecord
    validate :validate_disabled, on: update

    def validate_disabled
        if standard? && disabled
            question.errors.add(:disable, "You cannot disable a standard question")
        end
    end
end
类问题控制器
我认为这篇文章应该为您指出正确的方向。我可以提供更多的帮助,如果你需要后,检查后的职位。这样你就可以确保没有人能够通过你的标准问题规则