2011-12-03 32 views
0

我創建了一個窗體(「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門科目可能創建失敗..

驗證爲Form1中 Guess.rb

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 

評論:我認爲這驗證得到觸發,因爲在形式方法( :法語:數學等)均在驗證陣列[數學,法國...]在...我猜這是錯誤的

-

窗體2

在控制器.... @teacher = Guess.new

視圖

...

<div class="field"> 
    <%= f.label(:MrSmith, "MrSmith") %> 
    <%= f.select:MrSmith, 1..6 %> </br> 
    </div> 

那麼,爲什麼Form1的驗證獲取調用時,我提交窗口2?

如前所述,我想確認接到電話爲Form1,因爲陣列中的方法驗證(對象

[math, french, english, science, history, geography].select{|x| x }.count 

是在形式

<%= f.check_box(:math) %> 

命名的,即名稱所以如果我的Form2有不同的屬性(如老師的名字

<%= f.select:MrSmith, 1..6 %> 

我做不明白爲什麼這會觸發對其中的科目名稱(數學,法語等)的驗證?

我認爲我的想法完全錯誤。那麼是什麼觸發了驗證,我如何得到它不適用於form2?

回答

1

只要猜測模型被保存,就會調用Guess.rb中的所有驗證(默認情況下,您可以使用save(:validate => false)禁用它們)。

保存模型時只應用一些驗證通常不是一個好主意,因爲您將失去保證數據庫與所有驗證一致的保證。

如果你真的想這樣做,你可以創建一個新的屬性,且僅當該屬性爲true運行驗證,看到這個答案https://stackoverflow.com/a/3956701/625365

+0

謝謝你,但如果我有一個不同的驗證方法的不同的形式。如何指定哪種驗證適用於哪種形式...?我在哪裏寫:validate => false? – Leahcim

+0

我試過form_for(@teacher):validate => false do | f |它給了我一個錯誤消息 – Leahcim

+0

看到我的編輯,:驗證=>錯誤不是你的問題的答案我只是想澄清,它可以保存沒有驗證 – spike

相關問題