2014-03-25 43 views
0

我有一个数据库表,其中有一列是项目的模型请求。项目是一个数组。当用户提交表单时,我需要一个验证来确保数组在被允许提交之前不是空的(即,至少有一个项目被选中)。验证在Rails(非HABTM)中至少选择了一个check_box

我发现如果项目是一个属于请求的模型,但是如果项目只是请求中的一列,那么该如何做到这一点。下面是我的最好的尝试,但它不工作,因为我得到了一个错误'你需要提供至少一个验证

型号代码

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

顺便说一句,你有'item'的复选框,': item'在许可证中,但是正在访问模型代码中的'items' ....我建议将它们都称为“物品”以减少混淆。你正在谈论一系列物品......所以将它们命名为'物品' –

+0

啊所以我解决了这个问题,但是在相反的情况下,我决定调用所有物品,因为这是数据库中的表格。但后来,正如我在下面的其他评论中写的,self.item.blank?没有通过错误,但也没有实际做检查 – james

+0

是的 - 它会在单个项目和多个项目之间混淆。更好地解决它的方式,这是真正明智的;) –

回答

0

好吧......什么情况是,复选框,选中时,存储在阵列中为“0 “,所以验证失败,因为该数组在技术上并不空白。

当没有被选中时,被存储的PARAMATERS是 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 
+1

这不可能是答案。 – zeantsoi

2

正确的自定义验证调用如下:

validate :must_have_one_item 

注意,自定义验证模块使用validate,不validates调用。根据the docsvalidate执行以下操作:

向类中添加验证方法或块。当重写validate实例方法变得太笨重时,这很有用,而且您正在寻找更多描述性声明来验证您的验证。

对比这与validates是如何调用的,再次,从the docs

这个方法是一个快捷方式,将所有默认验证并在“验证”结尾的任何自定义的验证类。

1

这会为每个空白的项目添加一个错误。

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 
+0

我绝对想要你说的后者。但是对于代码(或者),它会为NilClass引发一个未定义的方法“items”。我不知道为什么它没有响应这个方法(这是btw,我改成了if @ requestrecord.items.blank?因为@requestrecord = Request.new每个控制器) – james

+0

啊 - 对不起,让我的回答困惑...让我更新。 –

+0

所以 - 我们已经在请求中了。要获取这组项目,您不需要转到“@ request”变量,而是使用'self'来引用“我们现在正在保存的当前请求” –

相关问题