Ruby on rails Rails对必填字段的自定义验证

Ruby on rails Rails对必填字段的自定义验证,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个应用程序,用户必须填写所有调查问题(每个问题下方的单选按钮)。当用户只回答一个问题时,我从视图中获得的示例参数是: {"answer_11"=>"", "answer_12"=>"", "answer_16"=>"", "answer_9"=>"Velit assumenda id.", "ans

我有一个应用程序,用户必须填写所有调查问题(每个问题下方的单选按钮)。当用户只回答一个问题时,我从视图中获得的示例参数是:

{"answer_11"=>"", "answer_12"=>"", "answer_16"=>"", "answer_9"=>"Velit assumenda id.", "answer_10"=>""}
我知道我应该在表单中使用
必需的
选项,但它不适用于我的简单表单视图:

<%= simple_form_for :test_results, url: test_results_path  do |f| %>
  <% @randomize_questions.map do |q| %>
    <%= q[:question] %>
    <%= f.input "answer_#{q[:id]}", required: true, collection: q[:answers], as: :radio_buttons, value: { question: q[:question], answer: q[:answer]} %>
  <% end %>
  <%= f.button :submit %>
<% end %>

如果用户没有回答所有问题,如何编写此类验证以防止创建新记录?

您可以为
TestResult
模型编写验证程序

验证:应答,状态:true
-如果您的结果没有应答(字段将为空),则返回一个错误,您可以在
@test\u result.errors上看到他


查看该模型的DB模式会很有帮助(
TestResult
)。我假设它有一个名为
answer
的json或序列化字段,该字段存储散列
{“answer\u 11”=>,“answer\u 12”=>,“answer\u 16”=>,“answer\u 9”=>,“answer\u 10”=>,}
。要求是验证不存在空白值。您可以在
TestResult
模型中进行以下验证(假设
TestResult\answer
返回答案散列)

validate:没有空白答案
def no_空白_答案
如果回答。值。是否有(&:空白?)
错误。添加(:答案,“不能有空白答案”)
结束
结束

没有在
IRB
中测试过,但应该可以工作。

没有,没有。因为我的观点,我总是会有一些数据在里面。当用户不填写任何内容,只需按提交按钮,我将创建一个新的记录,其答案如下:
{“answer\u 11”=>,“answer\u 12”=>,“answer\u 16”=>,“answer\u 9”=>,“answer\u 10”=>,
您可以添加验证空字符串的选项,
验证:answer,presence:true,allow\u blank:false,allow\u nil:false
,由于我为
构建了
表单_,它将始终是某种带有哈希的字符串,这就是为什么我需要创建自定义验证器的原因,因为它可以工作!是否有任何方法可以向用户显示该错误?它将错误添加到
answer
属性中。您可以使用
errors.add(:base,“不能有空白答案”)
如果您希望它不是特定于属性的。无论哪种方式,都可以像显示任何其他rails模型错误一样显示它。如有需要,请参阅官方指南:
  def create
    @test_result = TestResult.new(
      answer: test_result_params,
    )
    @test_result.save
  end

  def test_result_params
    params.require(:appropriateness_test_results).permit!
  end