d_r*_*ail 0 validation ruby-on-rails models ruby-on-rails-3.2
我建立了一个search模型,并且要求至少填写一个字段.我发现了一个有助于验证的问题,Rails:如何要求至少一个字段不为空.(我尝试了所有答案,但Voyta似乎是最好的.)
验证工作正常,除非我想通过attr_accessor或重新定义getter/setter attr_writer.(我在表单上有虚拟属性需要与验证分开.)为了弄清问题是什么,我使用属性作为常规属性进行了测试item_length.如果我添加attr_accessor :item_length,验证将停止工作.所以,我想问题是如何在不使用点表示法的情况下读取属性的值.由于验证使用字符串,我无法使用正常的阅读方式.
这是一个片段:
if %w(keywords
item_length
item_length_feet
item_length_inches).all?{|attr| read_attribute(attr).blank?}
errors.add(:base, "Please fill out at least one field")
end
Run Code Online (Sandbox Code Playgroud)
就像我说的那样,虚拟attrbutes(length_inches和length_feet)根本不起作用,并且普通属性(length)有效,除非我重新定义了getter/setter.
您应该将read_attribute视为读取Active Record列的私有方法.否则你应该总是直接使用读者.
self.read_attribute(:item_length) # does not work
self.item_length # ok
Run Code Online (Sandbox Code Playgroud)
由于您尝试动态调用它,因此可以使用泛型ruby方法public_send来调用指定的方法
self.public_send(:item_length) # the same as self.item_length
Run Code Online (Sandbox Code Playgroud)
如评论中所述,使用 send
array.all? {|attr| send(attr).blank?}
Run Code Online (Sandbox Code Playgroud)
对于那些想知道send在这种情况下是否正常的人,是的:对象调用自己的实例方法.
但这send是一个很好的工具,所以无论何时使用其他对象,都要确保使用他们的公共APIpublic_send
| 归档时间: |
|
| 查看次数: |
5500 次 |
| 最近记录: |