product ? product.title : "-"
尝试下面的写法
(product || "").title
当然是不行的因为 string 没有 title 方法。 最后要么沿用第一种写法,要么在 helper 中定义一个 function,然后调用
product_title(product_title)
感觉总是不舒服,大家有什么好的方案吗?
product.try(:title) || '-'
@saiga 哎呀 居然忘记了 try 这个用法,多谢多谢 有一篇 topic 介绍这个技巧: https://ruby-china.org/topics/5348
这个不是用 try 的场景,title 是 product 本来就有的方法,即使为空也不会报错。在 title 为空的情况下, product.title和product.try(:title)的结果都是 nil。
product.title
product.try(:title)
最简单也最好的处理方法:不允许关键 attribute 为空。
如果不需要处理为-, 那么直接<%= product.title %>,没有问题。因为nil.to_s结果为""。
-
<%= product.title %>
nil.to_s
""
如果空 title 变成-的逻辑只应用在单个特定的 view 里面,那么直接<%= product.title || '-' %>
<%= product.title || '-' %>
如果以上逻辑普遍适用所有 view, 最好的方法是用 decorator。
如果你不习惯或不需要用 decorator, 其次的方法是改写 model#title。
def title read_attribute(:title) || '-' end
@billy 对,没错。 预设的场景有问题,try 的场景应该是 product.cover.try(:url) || '-' 谢谢纠正 之前为了适应 product.title 的问题确实用的 decorator,这个 gem:https://github.com/drapergem/draper
product.cover.try(:url) || '-'
ps: 出于上下文考虑还是不修改帖子的标题和描述了。
@robot_zhang 用 Draper 就好处理了。
这个新场景,最好不要直接product.cover.url 或者product.cover.try(:url),违反 Law of demeter。用 Draper 的话就建议这样:
product.cover.url
product.cover.try(:url)
#Product def cover_url cover.url end #ProductDecorator def cover_url object.cover_url || '-' end
会比较干净。
@billy Draper 主要是会在另外一个目录中增加一个 Class 感觉总是不舒服