关于rails上的ruby:如何处理视图中的nils?

How do I handle nils in views?

我设置了以下型号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

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

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

1
contact.band && contact.band.name

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

非常感谢rails newb!


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

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

如果你的对象是一个数组或哈希,你可以使用空?功能而不是。

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

希望这可以帮助!

d


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

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

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

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

1
<%= blank_to_nbsp contact.band %>

优点:

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


您可以使用Object#和为此:

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

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

如果bandname不存在于各自对象上的方法,则返回nil


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