我有一个场景,一张专辑有很多曲目,曲目有可能有特色艺术家,也称为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)
有没有办法在不写这么长的表达式的情况下完成以下任务?
答案 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>