如何使Rails所需的Ruby条件结构DRY

3

我发现为了避免Rails错误 undefined method 'name' for nil:NilClass,我经常需要使用一种结构。

这个结构看起来像这样:

 if country.state
   country.state.name
 end

看起来这是一个典型的反复使用 country.state 的例子,出现在一个简单的代码块中两次。有没有什么方法可以使它更干净?


1
如何适当地DRY这个取决于你想用country.state.name做什么。你只是想返回它,并在country.statenil时返回nil吗? - Brian Campbell
是的。有时候一个州的国家代码没有原始数据,所以我不想让它抛出异常。 - Reed G. Law
3个回答

4
Rails为对象添加了一个try方法,它模仿了object#send的功能,但如果对象返回nil,则不会引发异常。
我认为语法是:
country.try(:state).name

这种方法是可行的,但我必须这样表达它:State.try(:find_by_iso, "AF").try(:country).try(:name) - Reed G. Law
难道不应该是 country.state.try(:name) 吗? - Mladen Jablanović

2

其实并不是。一种选择是安装andand gem,但引入这个依赖可能有点过头。


1

除了使用稍微更简洁的语法:

country.state.name unless country.state.nil?

我认为根据所提供的信息,没有DRY的方法来完成这个任务。如果你不能确定country.state是nil还是非nil,你可能需要查看设置该值的代码,并确定这是否是正常情况,或者上游验证程序是否应该捕获该问题。


一些country.state是空的,因为原始数据中没有这些州的信息。 - Reed G. Law
可以是country.state.name,如果country.state也可以。 - Yannis
不错的判断,Yannis。Reed,是的,我想你无法做任何事情……你的验证只能像数据允许的那样严格。 - brokenbeatnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接