check_box_tag验证form_tag

时间:2014-02-22 14:59:50

标签: ruby-on-rails ruby validation

我在验证时遇到问题,在用户可以继续之前,至少点击了其中一个复选框。 My View看起来像这样:

查看:

<%= form_tag("/categories/", :method => "post") do%>
<% @categories.each do |category| %>
    <div class="checkbox">
    <li><%= check_box_tag "categories[]", category.id %> <%= category.name %></li>

    </div>      

<%end%>
<%= submit_tag "Weiter", class: "btn btn-success btn-lg" %>
class Category < ActiveRecord::Base
has_and_belongs_to_many :users
has_and_belongs_to_many :books
end

所以会发生什么是用户注册并获取包含类别模型中可用的所有类别的屏幕。然后他检查这些并点击继续。在帖子类别与用户关联。但是,如何验证用户选择的至少一个类别。如果我做这样的事情就行不通:

validates_acceptance_of :categories,
:message => "Please take at least one category", :accept => true

3 个答案:

答案 0 :(得分:0)

您需要验证类别的存在。

validates :categories, presence: true

答案 1 :(得分:0)

您可以编写自己的验证器

  validate :at_least_one_category_selected

  private

  def at_least_one_category_selected
    if self.categories.blank?
      self.errors.add(:categories, "You must select at least one category.")
    end
  end

答案 2 :(得分:0)

我有一个解决方案,在这种情况下,我将在提交表单之前调用JS函数。这肯定会解决您的问题。

<%= form_tag("/categories/", :method => "post", id: 'add-category-form') do%>
  <% @categories.each do |category| %>
    <li><%= check_box_tag "categories[]", category.id %> <%= category.name %></li>
  <%end%>
  <%= button_tag "Weiter", :class => 'btn btn-success btn-lg', id: 'add-category-btn', onclick: "validateCategoryPresent()" %>
<%end%>

然后用JS

function validateCategoryPresent() {
  event.preventDefault();
  var checkboxes = Array.from(document.getElementsByName("categories[]"));
  if(checkboxes.reduce((acc, curr) => acc || curr.checked, false)){
    $('#add-category-form').submit();
  } else {
    //swal('Error','Please select atleast one channel!','warning');
    alert('Some error!')
  }
}
  • 我在form_tag的提交点击时调用了JS函数,(如果您使用的是sibmit_tag,请用button_tag替换它)
  • 我已阻止了“提交”按钮的默认行为
  • 然后,我开始按其ID /类或名称获取元素,并检查了我想在JS中执行的操作,然后基于我的验证要么我在表单ID上调用Submit(),要么显示错误消息。

注意:为显示错误消息,我使用了Sweet alert,您可以坚持使用alert();,但是如果您要寻找更好的UI,请在JS中取消注释我的swal()代码并注释出alert() ); 您可以阅读有关Sweet Alert PopUp

的更多信息