验证是否在Rails(非HABTM)中至少选中了一个复选框。 [英] Validate that at least one check_box is selected in Rails (non HABTM)

查看:81
本文介绍了验证是否在Rails(非HABTM)中至少选中了一个复选框。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用于模型Request的数据库表,该表具有一列为items的列。 Items是一个数组。当用户提交表单时,我需要进行验证,以确保在允许他们点击提交之前,数组不为空(即,至少检查了一项)。

I have a database table for the model Request that has a column that is items. Items is an array. When the user submits the form, I need a validation that ensures that the array is not empty (i.e., at least one item is checked) before they're allowed to hit submit.

我已经找到了如果item是属于Request的模型的方法,但是如果item只是Request中的一列,则不是。下面是我的最佳尝试,但是没有用,因为我收到一个错误消息您需要提供至少一个验证

I've found how to do this if item were a model that belonged to Request, but not if item is just a column within Request. Below is my best attempt, but it's not working, because I got an error `You need to supply at least one validation

模型代码

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,因此验证失败,因为该数组在技术上并不是空白。

Ok... what happens is that checkboxes, when unchecked, are stored in the array as "0", so the validation fails because the array isn't technically blank.

不检查任何内容时,存储的参数为
items = [ 0, 0, 0 , 0] 而不是 items = []

When nothing is checked, the paramaters that are stored is items = ["0", "0", "0", "0"] instead of items=[]

因此,它做了什么是这样的:

Therefore what did it was this:

 def must_have_one_item
     errors.add(:items, 'You must select at least one item') unless self.items.detect { |i| i != "0" } 
 end

这篇关于验证是否在Rails(非HABTM)中至少选中了一个复选框。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆