我正在通过尝试模拟可收集的纸牌游戏来学习rails。
我有一个冠军模型和稀有模型。我在模型定义中有has_many / belongs_to,这在控制台中有效:
c = Champion.find(1)
c.rarity.name
=> "Uncommon"
当我在模板中做同样的事情时,我得到了
<%= champion.rarity.name %>
undefined method `name' for nil:NilClass
有关如何使其发挥作用的任何想法?
这是在Rails 3.2.2上。
<% @champions.each do |champion| %>
<tr>
<td><%= champion.name %></td>
<td><%= champion.rarity.name %></td>
</tr>
<% end %>
答案 0 :(得分:6)
如果每个Champion
没有Rarity
关联(有些是nil
),您可以使用.try()
打印该名称。否则,.each
将在遇到NoMethod
的{{1}}时失败并显示Rarity
。
<% @champions.each do |champion| %>
<tr>
<td><%= h champion.name %></td>
<td><%= h champion.rarity.try(:name) %></td>
</tr>
<% end %>
或者不那么聪明的unless nil
方法:
<% @champions.each do |champion| %>
<tr>
<td><%= h champion.name %></td>
<td><%= h champion.rarity.name unless champion.rarity.nil? %></td>
</tr>
<% end %>
注意:我还添加了h()
辅助方法来对HTML输出进行编码,尽管这是在Rails 3中自动完成的。