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