如何处理视图中的nils?

时间:2010-04-08 15:09:45

标签: ruby-on-rails ruby

我设置了以下型号:

class Contact < ActiveRecord::Base
  belongs_to :band
  belongs_to :mode

  validates_presence_of :call, :mode
  validates_associated :mode, :band
  validates_presence_of :band, :if => :no_freq?
  validates_presence_of :freq, :if => :no_band?

protected

  def no_freq?
    freq.nil?
  end

  def no_band?
    band.nil?
  end
end

class Band < ActiveRecord::Base
  has_many :logs
end

class Mode < ActiveRecord::Base
  has_many :logs
end

当我在 new 视图中输入频率时,如果输入了频率,则不允许指定频段。这在我的其他视图中产生了一个问题,因为band现在为零。如何在我的索引 show 视图中禁止指定band并显示为空,然后在 edit 视图中允许在稍后的某个时间指定一个。

我已经能够通过执行以下操作让我的索引显示空白:

contact.band && contact.band.name

但我不确定这是否是最佳方法,而且我不确定如何将类似的解决方案应用于其他观点。

非常感谢rails newb!

5 个答案:

答案 0 :(得分:8)

在我的视图中,我在视图中使用以下可能的nil对象:

<%= @contact.band.name unless @contact.band.blank? %>

如果您的对象是数组或散列,您可以使用空?而不是功能。

<%= unless @contacts.empty? %>
 ..some code
<% end %>

希望这有帮助!

d

答案 1 :(得分:3)

几年前,但仍然是“rails view handle nil”的Google搜索结果,所以我将添加我的建议,用于Rails 3.2.3和Ruby 1.9.3p0。

application_helper.rb 中,添加以下内容:

def blank_to_nbsp(value)
  value.blank? ? "&nbsp;".html_safe : value
end

然后要在视图中显示值,请写下这样的内容:

<%= blank_to_nbsp contact.band %>

优点:

  • “blank”捕获nil值和空字符串(details)。
  • 简单地省略nil对象或使用空字符串可能会导致格式化问题。 &nbsp;将不间断的空间推入网页并保留格式。
  • 使用其他答案中的“if”和“unless”建议,您必须输入两次每个对象名称。通过使用帮助程序,您只需键入一次对象名称。

答案 2 :(得分:2)

<%= @contact.try(:band).try(:name) %>

如果nilband不存在作为各自对象的方法,则会返回name

答案 3 :(得分:2)

您可以使用Object#andand

<%= @contact.band.andand.name %>

答案 4 :(得分:0)

<%= @contact.band if @contact.band %>也有效