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

Kev*_*ker 3 ruby-on-rails

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

setname1_paramname
setname1_paramname2
Run Code Online (Sandbox Code Playgroud)

现在,我需要检查其中一个"集合"以验证是否已提交所有字段.现在,我正在使用手动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
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Upg*_*ave 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
Run Code Online (Sandbox Code Playgroud)


edg*_*ner 6

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

class SomeModel < ActiveRecord::Base
  VIRTUAL_ATTRIBUTES = [:billing_address, :billing_state, :something_else]
  attr_accessor *VIRTUAL_ATTRIBUTES
  validates_presence_of *VIRTUAL_ATTRIBUTES
  …
end
Run Code Online (Sandbox Code Playgroud)