1

アルバム データベースからアーティストの名前を取得しようとしています。これらは私の2つのモデルです

class Album < ActiveRecord::Base

  belongs_to :artist

  validates_presence_of :title
  validates_length_of :title, :minimum => 5
 end

class Artist < ActiveRecord::Base

  has_many :albums

end

そして、これがアルバムコントローラーです

 def index
 @ albums = Album.all

 respond_to do |format|
   format.html # index.html.erb
   format.xml  { render :xml => @albums }
 end
end

そして、インデックスからのビュー:

<% @albums.each do |album| %>
  <tr>
    <td><%=h album.id %></td>
    <td><%=h album.title %></td>
    <td><%=h album.artist.name %></td>
  </tr
<% end %>

私の最終結果のhtmlは、アーティストフィールドでこのように出てきます!

#<Artist:0x000001022e4868>   

に設定すると、次のようartist.name になります。

undefined method `name' for nil:NilClass

私は何を間違っていますか?

4

5 に答える 5

3

アーティストのいないアルバムがあるようです(artist_idがnullであるか、存在しないartist_idに設定されています)。

あなたが試すことができます:

<%= h album.artist ? album.artist.name : 'N/A' %>
于 2010-05-24T19:53:59.077 に答える
3

次のようなことをする必要があります:

<%=h album.artist.name %>

あなたがそれを使用した方法は、いわばオブジェクト全体を表示しています。

于 2010-05-24T18:55:50.713 に答える
1

前に列挙したものを別の方法で書きます。

<%= h album.artist.name unless album.artist.blank? %>

スクリプト/コンソールに移動し、すべての記事を取得してすべてのアーティスト名を出力するプロセスを手動で実行することをお勧めします。

ところで、このコードを本番環境で実行している場合は、おそらく熱心な読み込みを使用する必要があります

 @ albums = Album.find(:all, :includes => [:artist]) 

これにより、はるかに効率的になります。

于 2010-05-24T21:42:05.493 に答える
0

アーティストとアルバムの関係を保存するために何かが起こっています。そのエラーが発生した場合は、アーティストがnilに戻っています。これは、キーがテーブルに保存されていないことを意味します。テーブルを手動でチェックし、関係が存在しないことを確認します。そうでない場合は、間違った場所を探しています。保存を修正する必要があります。

于 2010-05-24T19:53:40.760 に答える
0

データベーステーブルにデータが正しく設定されていますか? アーティストとアルバムのモデルが正しく保存されている場合、次のようになります。

artists table

id|name
---------------------
 1|The Beatles
 2|The Rolling Stones

albums table

id|artist_id|title
--------------------------------------------------
 1|1        |The White Album
 2|2        |Exile on Main Street
 3|1        |Sgt. Pepper's Lonely Hearts Club Band
于 2010-05-24T19:55:03.550 に答える