2011-12-03 44 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