为什么这个验证适用?

时间:2011-12-03 16:45:42

标签: ruby-on-rails validation

我创建了一个表单(“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?

1 个答案:

答案 0 :(得分:1)

每当保存猜测模型时,都会调用Guess.rb中的所有验证(默认情况下,您可以使用save(:validate => false)禁用它们。)

在保存模型时仅应用一些验证通常不是一个好主意,因为您将失去数据库与所有验证一致的保证。

如果你真的想这样做,你可以创建一个新属性,只有当该属性为真时才运行验证,请参阅此答案https://stackoverflow.com/a/3956701/625365