Rails - 如何在html.erb模板中访问外键对象?在控制台中工作

mph*_*uie 2 ruby-on-rails

我正在通过尝试模拟可收集的纸牌游戏来学习rails.

我有一个冠军模型和稀有模型.我在模型定义中有has_many/belongs_to,这在控制台中有效:

c = Champion.find(1)

c.rarity.name
=> "Uncommon"
Run Code Online (Sandbox Code Playgroud)

当我在模板中做同样的事情时,我明白了

<%= champion.rarity.name %>

undefined method `name' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

有关如何使其工作的任何想法?

这是在Rails 3.2.2上.

更新:完整的.erb代码

<% @champions.each do |champion| %> 
  <tr> 
    <td><%= champion.name %></td>
    <td><%= champion.rarity.name %></td> 
  </tr>
<% end %>
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 6

如果每个Champion都没有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 %>
Run Code Online (Sandbox Code Playgroud)

或者不那么聪明的unless nil方法:

<% @champions.each do |champion| %> 
  <tr> 
    <td><%= h champion.name %></td>
    <td><%= h champion.rarity.name unless champion.rarity.nil? %></td> 
  </tr>
<% end %> 
Run Code Online (Sandbox Code Playgroud)

注意:我还添加了h()帮助方法来对HTML输出进行编码,尽管这是在Rails 3中自动完成的.