rails如果是object.nil?那么魔术''在观点中?

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)

  • 我知道这将是一个头脑清醒,谢谢. (2认同)

Tob*_*ede 44

你也可以试试新的Object.try语法,原谅双关语.

这是闪亮的新Rails 2.3:

tax_payment.try(:user).try(:name)
Run Code Online (Sandbox Code Playgroud)


Ant*_*nen 10

Ruby社区对自动化这个成语给予了极大的关注.这些是我所知道的解决方案:

最着名的可能是Rails中的try方法.但是,它受到了一些 批评.

无论如何,我认为Ben的解决方案是完全足够的.


Ken*_*enB 9

我总是喜欢这种方法:

模型:

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


Jör*_*tag 7

有关更全面的解决方案,您可以查看介绍空对象重构.这种重构的基本机制是,不是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用作空对象).