2011-12-03 48 views
0

我有一個數據被提交給模型猜測的表單。在表單提交中在Rails中觸發自定義驗證

<%= form_for(@guess) do |f| %> 

該表格是一堆複選框,我希望確保至少有6個選中。

有人幫我,我把我的猜測模型

validates_inclusion_of :check_box_count, :in => 2..2, :message => "Two checkboxes should be ticked" 

... 

private 


def check_box_count 
    [secondanswer_chambersapp, secondanswer_drafting, secondanswer_letter, 
    secondanswer_interview, secondanswer_solicitor, secondanswer_barrister 
    ].select{|x| x }.count 
end 

但是這個自定義的驗證,我不明白我怎麼可以從提交的意見形式的觸發此方法。這是整個表單的樣子。我看着在軌道導軌6.2,但它是我的簡單的新手腦子太混亂... http://guides.rubyonrails.org/active_record_validations_callbacks.html#performing-custom-validations

您能否提供我怎麼能與驗證方法的觸發鏈接的形式提交?當您嘗試保存記錄時

<%= form_for(@guess) do |f| %> 
    <% if @guess.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@guess.errors.count, "error") %> prohibited this guess from being saved:</h2> 

     <ul> 
     <% @guess.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 


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

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

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

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

    <div class="field"> 
    <%= f.label(:secondanswer_barrister, "Barrister's exam") %> 
    <%= f.select:secondanswer_barrister, 1..6 %> </br> 
    </div> 

    <div class="field"> 
    <%= f.label(:secondanswer_solicitor, "Solicitor's exam") %> 
    <%= f.select:secondanswer_solicitor, 1..6 %> </br> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

回答

0

模型驗證。在你的控制器中,表單提交後處理數據的方法應該在某個時候調用@ guess.save。這是模型運行驗證時的情況。最簡單的邏輯是這樣的:

def create 
    @guess = Guess.new(params[:guess]) 
    if @guess.save # Model validations are run 
    redirect_to guesses_url # Validations passed 
    else 
    render 'new' # Validations did not pass 
    end 
end 
+0

因此,驗證方法中提到的屬性是否允許驗證表單中的相同屬性?否則,我不會看到它們是如何鏈接的,因爲驗證方法的名稱可以是任何東西...... – Leahcim

0

您可以指定模型中的自定義validate方法,其節約

validate :checkboxes_have_enough_checked 

private 
def checkboxes_have_enough_checked 
    [:secondanswer_chambersapp, 
    :secondanswer_drafting, 
    :secondanswer_letter, 
    :secondanswer_interview, 
    :secondanswer_solicitor, 
    :secondanswer_barrister 
    ].each do |attr| 
    errors.add(attr, "At least 2 need to be checked!") if self.send(attr).to_i < 2 
    end 
end 

如果存在錯誤之前調用,該模型將無法保存。詳情請參閱http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-methods