我有一个模型Request的数据库表,其中有一列是项目。 Items是一个数组。当用户提交表单时,我需要一个验证,确保在允许数组提交之前,数组不是空的(即,至少检查了一个项目)。
如果item是属于Request的模型,我发现如何执行此操作,但如果item只是Request中的列,则不会。以下是我最好的尝试,但它不起作用,因为我收到错误“你需要提供至少一次验证
型号代码
class Request < ActiveRecord::Base
serialize :item
validates :must_have_one_item
def must_have_one_item
for item in @request.items
errors.add(:base, 'You must select at least one item') if request.item.blank?
end
end
查看表单代码
<%= f.check_box(:item, {:multiple => true}, "#{item}") %>
控制器代码
def create
@requestrecord = Request.new(request_params)
end
private
def request_params
params.require(:request).permit({:item => []})
end
答案 0 :(得分:4)
正确调用自定义验证如下:
validate :must_have_one_item
请注意,使用validate
而非 validates
调用自定义验证功能块。根据{{3}},validate
执行以下操作:
向类添加验证方法或块。当覆盖验证实例方法变得过于笨拙并且您正在寻找更具描述性的验证声明时,这非常有用。
将此与the docs再次调用validates
的方式进行对比:
此方法是所有默认验证器和任何以&#39; Validator&#39;结尾的自定义验证器类的快捷方式。
答案 1 :(得分:2)
这会为每个空白项添加错误。
def must_have_one_item
for item in @request.items
errors.add(:base, 'You must select at least one item') if request.item.blank?
end
end
如果所有这些都是空白,您想添加错误吗?
def must_have_one_item
errors.add(:base, 'You must select at least one item') if self.items.all?{|item| item.blank? }
end
或者,根据您的项目的运作方式,这也可以起作用::
def must_have_one_item
errors.add(:base, 'You must select at least one item') if self.items.blank?
end
答案 2 :(得分:0)
好的......当未选中时,复选框将作为&#34; 0&#34;存储在数组中,因此验证失败,因为数组在技术上不是空白。
当没有选中任何内容时,存储的参数是
items = ["0", "0", "0", "0"]
代替items=[]
因此是什么:
def must_have_one_item
errors.add(:items, 'You must select at least one item') unless self.items.detect { |i| i != "0" }
end