我对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
理想情况下,丢失的字段只会呈现空白,但我不确定为什么它会破坏整个视图。任何帮助将不胜感激!
答案 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/