【问题标题】:Mapping and linking model instances in a Rails show view在 Rails 显示视图中映射和链接模型实例
【发布时间】:2015-05-01 14:37:48
【问题描述】:

我有一个场景,一张专辑有很多曲目,并且这些曲目可能有特色艺术家,也称为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 帮助方法的帮助下),请将它们列出并链接到他们自己的 show 视图。呈现的示例如下所示:

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

或者如果有两个以上的精选艺术家:

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

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

【问题讨论】:

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


    【解决方案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>
    

    【讨论】:

    • 谢谢。只需从map 代码块中删除do,我会将其标记为正确。否则你会遇到错误。
    猜你喜欢
    • 2011-10-21
    • 2013-04-11
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多