我创建了一个表单(“Form1”)并进行了验证。然后我为另一个目的创建了一个不同的表单(“Form2”),但是当我提交Form2时触发了“Form1”的验证方法
Form2和Form1都被提交到同一个数据库,但我认为验证不适用于它们,因为属性/方法名称在表单中有所不同
表单1
<%= form_for(@guess) do |f| %>
<% if @guess.errors.any? %>
<div class="field">
<%= f.label(:math, "I think many students will fail Math") %>
<%= f.check_box(:math) %> </br>
</div>
<div class="field">
<%= f.label(:french, "I think many students will fail French") %>
<%= f.check_box(:french) %> </br>
</div>
我为6个科目做同样的事情。学生需要选择3个可能造成失败的科目。
模型Guess.rb
中对 Form1 的验证validates_inclusion_of :possible_assessment_failures, :in => 1..3, :message => "You must check off 1,2 or 3 different assessments for question 1"
...
def possible_assessment_failures
[math, french, english, science, history, geography].select{|x| x }.count
end
评论:我认为这个验证被触发了,因为表格中的方法(:法语,数学等)在验证中的数组[math,french ...]中......我猜这是错的
-
窗体2
在控制器中.... @teacher = Guess.new
在视图中......
<div class="field">
<%= f.label(:MrSmith, "MrSmith") %>
<%= f.select:MrSmith, 1..6 %> </br>
</div>
那么为什么在我提交form2时会调用form1的验证?
如上所述,我认为验证调用了form1,因为验证中数组中的方法(即主题名称
[math, french, english, science, history, geography].select{|x| x }.count
以
的形式命名<%= f.check_box(:math) %>
所以如果我的Form2有不同的属性(比如老师的名字
)<%= f.select:MrSmith, 1..6 %>
我不明白为什么会触发主题名称(数学,法语等)的验证?
我认为我的思维完全错误。那么什么触发了验证,如何让它不适用于form2?
答案 0 :(得分:1)
每当保存猜测模型时,都会调用Guess.rb中的所有验证(默认情况下,您可以使用save(:validate => false)
禁用它们。)
在保存模型时仅应用一些验证通常不是一个好主意,因为您将失去数据库与所有验证一致的保证。
如果你真的想这样做,你可以创建一个新属性,只有当该属性为真时才运行验证,请参阅此答案https://stackoverflow.com/a/3956701/625365