Rails忽略循环中的“nil”值

时间:2013-12-06 20:47:46

标签: ruby-on-rails ruby

我对rails很新,这似乎很基本,但我找不到直接的答案。

我有4个模特:

def Order
  has_many :payments

def Payment
  belongs_to :order
  has_one :collection
  has_one :dispute

def Collection
  belongs_to :payment

def Dispute
  belongs_to :payment

“show”订单页面包含订单详细信息和所有付款的循环:

<% @order.payments.each do |f| %>
<div class="well">
  <p> Payment Date: <%= f.date_created %> </p>
  <p> Amount: <%= f.amount %> </p>
    ....# some other fields
  <p> Collection Date: <%= f.collection.date_created %> </p>
  <p> Disputed Date: <%= f.dispute.date_created %> </p>
</div>
     

除非此循环中缺少任何值,否则这一切都很完美。这是很多,因为许多付款没有“收藏”或“争议”。如果缺少任何值,我会收到以下错误:

NoMethodError in Orders#show
undefined method `whatever value is missing' for nil:NilClass  

理想情况下,丢失的字段只会呈现空白,但我不确定为什么它会破坏整个视图。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

查看Object#try方法,以下是您使用它的方法:

<% @order.payments.each do |f| %>
<div class="well">
  <p> Payment Date: <%= f.try(:date_created) %> </p>
  <p> Amount: <%= f.try(:amount) %> </p>
    ....# some other fields
  <p> Collection Date: <%= f.try(:collection).try(:date_created) %> </p>
  <p> Disputed Date: <%= f.try(:dispute).try(:date_created) %> </p>
</div>

使用上面的try将确保您不会抛出错误,而是根据需要呈现空白。

更新:

正如@muistooshort评论的那样,try应谨慎使用,因为潜在的错误可能会在不知不觉中被吞噬。仅在需要的地方使用try;在这种情况下f.try(:dispute)f.try(:collection)

答案 1 :(得分:0)

您可以使用try方法 - http://api.rubyonrails.org/classes/Object.html#method-i-try

例如,替换

<%= f.date_created %>

<%= f.try(:date_created) %>

答案 2 :(得分:0)

您也可以使用NullObject模式。它更复杂,但在每种可能的情况下处理空白值可能会导致很多意大利面条代码。此外,根据我的经验try方法经常被过度使用。看看:http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/