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