新手问题 product ? product.title : "-" 能不能更简洁

robot_zhang · 2014年10月14日 · 最后由 robot_zhang 回复于 2014年10月14日 · 2317 次阅读
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.titleproduct.try(:title)的结果都是 nil。

最简单也最好的处理方法:不允许关键 attribute 为空。

如果不需要处理为-, 那么直接<%= product.title %>,没有问题。因为nil.to_s结果为""

如果空 title 变成-的逻辑只应用在单个特定的 view 里面,那么直接<%= 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

ps: 出于上下文考虑还是不修改帖子的标题和描述了。

@robot_zhang 用 Draper 就好处理了。

这个新场景,最好不要直接product.cover.url 或者product.cover.try(:url),违反 Law of demeter。用 Draper 的话就建议这样:

#Product
def cover_url
  cover.url
end

#ProductDecorator
def cover_url
  object.cover_url || '-'
end

会比较干净。

@billy Draper 主要是会在另外一个目录中增加一个 Class 感觉总是不舒服

需要 登录 后方可回复, 如果你还没有账号请 注册新账号