2

トレーディングカードゲームをモデル化して、レールを学んでいます。

チャンピオンモデルとレアリティモデルがあります。モデル定義にhas_many/belongs_toがあり、これはコンソールで機能します。

c = Champion.find(1)

c.rarity.name
=> "Uncommon"

テンプレートで同じことをすると、

<%= champion.rarity.name %>

undefined method `name' for nil:NilClass

これを機能させる方法について何かアイデアはありますか?

これはRails3.2.2にあります。

更新:完全な.erbコード

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

1 に答える 1

6

すべてChampionに関連付けがない場合Rarity(一部は関連付けられていnilます)、を使用し.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 %> 

:これらをHTML出力用にエンコードするためのヘルパーメソッドも追加しましたがh()、これはRails3で自動的に行われます。

于 2012-04-13T00:20:09.343 に答える