如何在show.html.erb中渲染部分

时间:2013-04-09 01:22:29

标签: ruby-on-rails-3.1 partial-views rails-activerecord

我在Ruby on Rails应用程序中有这两个模型 - Artist和Song。它们的关联如下:

  

class Artist<的ActiveRecord ::基

     

has_many:歌曲

     

attr_accessible:artist_name

  

类歌曲<的ActiveRecord ::基

     

belongs_to:艺术家

     

attr_accessible:title,:track_URL,:artist_id

我在views / artist / show.html.erb中有这段代码:

<%=  render 'artist_song'  %>

<table>
    <% @artist.songs.each do |song| %>
        <tr>
          <td><%= song.title %></td>
        </tr>
    <% end %>
</table>

在同一视图中尝试渲染(_artist_song.html.erb)的部分Im看起来像这样:

<table>
  <% @artist = Artist.all %>
  <% @artist.each do |artist| %>
      <tr>
        <td><%= link_to artist.artist_name, artist %></td>
      </tr>
  <% end %>
</table>

假设工作的方式是当我点击显示部分的艺术家时,部分下面的代码必须显示属于特定艺术家的所有歌曲。 table标记中的partial和code都是单独工作的。但是当我把它们放在一起时,看起来它们之间存在冲突,服务器正在向我显示这个没有方法错误:

NoMethodError in Artists#show

Showing C:/Sites/OML/app/views/artists/show.html.erb where line #9 raised:

undefined method `songs' for #<Array:0x5fe1418>
Extracted source (around line #9):

6: 
7: 
8: <table>
9:     <% @artist.songs.each do |song| %>
10:         <tr>
11:           <td><%= song.title %></td>
12:         </tr>
Rails.root: C:/Sites/OML

Application Trace | Framework Trace | Full Trace
app/views/artists/show.html.erb:9:in `_app_views_artists_show_html_erb__950110288_54062208'
app/controllers/artists_controller.rb:21:in `show'

我找不到解决方案。任何帮助将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:0)

你没有使用偏袒。您需要在artist循环中呈现部分:

<强> show.html.erb

<table>
  <% @artists = Artist.all %>
  <% @artists.each do |artist| %>
    <tr>
      <td><%= link_to artist.artist_name, artist %></td>
    </tr>
    <%= render :partial => 'artist_song', :artist => artist %>
   <% end %>
</table>

这样,您将当前artist对象传递到partial中,因此可以执行以下操作:

<强> artist_song.html.erb

<% artist.songs.each do |song| %>
  <tr>
    <td><%= song.title %></td>
  </tr>
<% end %>