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

Mapping and linking model instances in a Rails show view

我有一个场景,一张专辑有很多曲目,并且这些曲目可能有特色艺术家,也称为 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>

上面的 objective 是显示曲目的名称,如果曲目有任何特色艺术家(在 to_sentence 辅助方法的帮助下),将他们列出来并 link 到他们自己的 show 视图。呈现的示例看起来像这样:

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

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

Good Friday (feat. Common, Pusha T, Kid Cudi, Big Sean & Charlie Wilson)

有没有什么方法可以在不写这么长的表达式的情况下完成以下操作?

我会把所有的逻辑都移到一个助手中,例如创建一个方法 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>