Rails:在params哈希上动态迭代以验证它们是否存在

时间:2011-01-25 20:05:37

标签: ruby-on-rails

我有一张表格,其中有很多参数被传递给控制器​​进行处理。 params的不同“集合”以类似的方式命名:

setname1_paramname
setname1_paramname2

现在,我需要检查其中一个“集合”以验证是否已提交所有字段。现在,我正在使用手动If或样式声明:

if setname1_paramname.blank? || setname1_paramname2.blank? || ...etc
  @object.errors.add_to_base("All setname1 fields are required.").
  render :action => 'new'
  return false
end

有没有办法以编程方式循环遍历这些参数,并将它们添加到@object错误?

谢谢!

5 个答案:

答案 0 :(得分:9)

因为听起来你有大量的参数并且看起来你需要能够对一组参数进行检查,这样的事情可能会有用吗?基本上,迭代params散列,并使用正则表达式来定位params集。然后,在循环内部,您可以进行任何类型的验证:

params.each do |key, value| 
   # target groups using regular expressions
   if (key.to_s[/setname1.*/])
     # whatever logic you need for params that start with 'setname1'
     if param[key].blank?
       @object.errors.add_to_base("All setname1 fields are required.").
     end
   end
end

答案 1 :(得分:6)

如果名称是任意的并且由您自己选择,您可以在模型中为它​​们创建虚拟属性,并让Rails处理状态检查。

class SomeModel < ActiveRecord::Base
  VIRTUAL_ATTRIBUTES = [:billing_address, :billing_state, :something_else]
  attr_accessor *VIRTUAL_ATTRIBUTES
  validates_presence_of *VIRTUAL_ATTRIBUTES
  …
end

答案 2 :(得分:1)

是否有理由不将这些信息存储在模型中,即使是暂时的,然后只使用rails验证来获取您的信息?

答案 3 :(得分:0)

我生锈但我认为即使值为空,只要它来自一个表单元素,param仍将在params哈希中返回,是吗?你能不能遍历params散列并保持计数器中有多少个值不为空,然后将params散列的长度与计数器进行比较。如果计数器很短,那么你有空白的参数并且可以用这种方式处理错误,而不必对每个参数进行硬编码检查,是吗?

答案 4 :(得分:0)

如果您需要的是我所怀疑的多步骤表单,您可能会发现Railscast on Multistep Forms很有用