2

我正在通过尝试为可收藏的纸牌游戏建模来学习 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 上。

更新:完整的 .erb 代码

<% @champions.each do |champion| %> 
  <tr> 
    <td><%= champion.name %></td>
    <td><%= champion.rarity.name %></td> 
  </tr>
<% end %>
4

1 回答 1

6

如果 everyChampion没有Rarity关联(有些是nil),您可以使用 a.try()打印名称。否则, 当遇到没有 a的情况时,.each将失败。NoMethodRarity

<% @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 中自动完成的。

于 2012-04-13T00:20:09.343 回答