我正试图从相册数据库中提取艺术家的名字。 这些是我的两个模型
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
我做错了什么?
答案 0 :(得分:3)
您需要执行以下操作:
<%=h album.artist.name %>
你使用它的方式是显示整个对象,可以这么说。
答案 1 :(得分:3)
听起来你有没有艺术家的专辑(artist_id为null或设置为不再存在的artist_id)。
您可以尝试:
<%= h album.artist ? album.artist.name : 'N/A' %>
答案 2 :(得分:1)
另一种编写前面列举的内容的方法。
<%= h album.artist.name unless album.artist.blank? %>
我建议您进入脚本/控制台并手动完成拉动所有文章然后打印出所有艺术家名称的过程。
顺便说一句,如果您在生产中运行此代码,则应该使用预先加载
@ albums = Album.find(:all, :includes => [:artist])
这会更有效率。
答案 3 :(得分:0)
保存您的艺术家 - >专辑关系正在发生一些事情。如果你收到了这个错误,你会得到一个nil艺术家,这意味着密钥没有保存在表格中。手动检查你的桌子,并确保关系是否存在,如果不是那么你在错误的地方,你应该修复你的保存。
答案 4 :(得分:0)
您确实在数据库表中正确设置了数据吗?如果您的Artist和Album模型正确保存,那么它应该如下所示:
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