如何向方法传递字段名并检查对象指定字段是否为空?
动态检查Product指定字段是否有值的实现方案
嘿,这个问题在Ruby/Rails里其实很好解决,核心就是利用Ruby的send方法来动态调用对象的属性——这正是你需要的product.f.blank?的实现方式。
首先先明确两种常见的业务场景,你可以根据自己的实际需求选择:
场景1:只要有一个指定字段不为空,就返回true(所有字段都为空才返回false)
这正好对应你注释里提到的“若所有字段都为空则返回false”的需求,代码可以这样写:
def show_card?(product, fields) # any?会遍历字段数组,只要有一个字段非空就返回true fields.any? { |field| !product.send(field).blank? } end
解释一下:
product.send(field):通过字段名字符串/符号动态调用product的对应属性方法,比如field是:name时,就等价于product.name!product.send(field).blank?:判断该字段是否不为空any?:只要数组中有一个元素满足条件,就返回true;如果所有元素都不满足(也就是所有字段都为空),返回false
场景2:所有指定字段都不为空才返回true(只要有一个为空就返回false)
如果你需要确保所有指定字段都有值才显示卡片,那可以用all?或者none?来实现:
def show_card?(product, fields) # 所有字段都非空才返回true fields.all? { |field| !product.send(field).blank? } end # 或者用更直观的none?写法: def show_card?(product, fields) # 没有任何字段为空时返回true fields.none? { |field| product.send(field).blank? } end
在Partial中的使用
不管选哪种实现,在视图partial里调用都很简单:
<% if show_card?(@product, [:name, :details, :color]) %> <!-- 这里放你要显示的卡片内容 --> <% end %>
注意:如果你的字段名是字符串数组(比如["name", "details"]),send方法也能正常工作,不需要额外转换,Ruby会自动处理符号和字符串的方法名匹配~
内容的提问来源于stack exchange,提问作者David S
相关产品推荐
相关产品推荐

