验证在Rails中选择了至少一个check_box(非HABTM)

时间:2014-03-25 05:37:20

标签: ruby-on-rails forms validation checkbox

我有一个模型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

3 个答案:

答案 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