这是其中之一,也许这么简单,我永远找不到它,因为其他人都已经知道了.
我有必须在我的视图中检查nil的对象所以我不会取消引用nil:
<%= if tax_payment.user; tax_payment.user.name; end %>
或者我可以做这个变种:
<%= tax_payment.user ? tax_payment.user.name : '' %>
所以这对大多数语言来说都没问题.但我觉得必须有一些闪亮的红宝石或铁杆我仍然缺少,如果这是我能做的最好的.
关于什么:
<%= tax_payment.user.name if tax_payment.user %>
你也可以试试新的Object.try语法,原谅双关语.
这是闪亮的新Rails 2.3:
tax_payment.try(:user).try(:name)
Ruby社区对自动化这个成语给予了极大的关注.这些是我所知道的解决方案:
试试 Ruby on Rails
另一个尝试
andand
更安全的andand
核心:: ERGO
送与 - 默认
也许
_?
如果 - 不为零
乌龟!
Groovy风格的method_
做或拒收
最着名的可能是Rails中的try方法.但是,它受到了一些 批评.
无论如何,我认为Ben的解决方案是完全足够的.
我总是喜欢这种方法:
模型:
class TaxPayment < ActiveRecord::Base belongs_to :user delegate :name, :to=>:user, :prefix=>true, :allow_nil=>true end
视图:
<%= tax_payment.user_name %>
http://apidock.com/rails/Module/delegate
有关更全面的解决方案,您可以查看介绍空对象重构.这种重构的基本机制是,不是nil
在客户端代码中检查,而是通过引入特定于上下文的null对象并返回它来确保提供者从不首先生成a .nil
因此,返回一个空字符串,一个空数组,一个空哈希或一个特殊的空客户或空用户或其他东西,而不仅仅是nil
,然后你将永远不需要检查nil
.
所以,在你的情况下你会有类似的东西
class NullUser < User def name return '' end end
但是,在Ruby中实际上有另一种非常优雅的方式来实现引入Null对象重构:实际上你不需要引入 Null对象,因为nil
它已经是一个对象了!因此,你可以使用猴子补丁nil
来表现为NullUser - 然而,在这种情况下,所有关于猴子修补的常见警告和陷阱都会更加强烈,因为nil
无声吞咽NoMethodError
或类似的东西可能会完全破坏你的调试体验和使它真的很难追查案件,其中有一个nil
是不应该存在(而不是一个nil
用作空对象).