在Rails show视图中映射和链接模型实例

时间:2015-05-01 14:37:49

标签: ruby-on-rails ruby model-view-controller dictionary interpolation

我有一个场景,一张专辑有很多曲目,曲目有可能有特色艺术家,也称为artists。这些关联设置得很好但主要是我的视图代码遭受了严重的冗长:

<table>
  <% @album.tracks.each do |track| %>
    <td>
      <%= raw !track.artists.empty? ? "#{track.name} (feat. #{track.artists.map {|artist| link_to artist.name, artist_path(artist)}.to_sentence({:two_words_connector => ' & ', :last_word_connector => ' & '})})" : track.name %>
   </td>
<table>

上述目标是显示曲目的名称,如果曲目有任何特色艺术家(借助to_sentence辅助方法),请将其列出并链接到他们自己的{{1查看。渲染的示例如下所示:

show

或者如果有两位以上的特色艺术家:

Give It To Me (feat. Justin Timberlake & Nelly Furtado)

有没有办法在不写这么长的表达式的情况下完成以下任务?

1 个答案:

答案 0 :(得分:1)

我会将所有逻辑移动到帮助器中,例如创建方法application_helper.rb

def display_track(track)
  if track.artists.empty? 
    track.name
  else
    links = track.artists.map {|artist| link_to artist.name, artist_path(artist) }
    sentence = links.to_sentence(two_words_connector: ' & ', last_word_connector: ' & ')

    "#{track.name} (feat. #{sentence})"    
  end
end

然后您的观点简化为:

<table>
  <% @album.tracks.each do |track| %>
    <td>
      <%= raw display_track(track) %>
    </td>
  <% end %>
<table>