我在验证时遇到问题,在用户可以继续之前,至少点击了其中一个复选框。 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
答案 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
替换它)注意:为显示错误消息,我使用了Sweet alert,您可以坚持使用alert();,但是如果您要寻找更好的UI,请在JS中取消注释我的swal()代码并注释出alert() ); 您可以阅读有关Sweet Alert PopUp
的更多信息