1

这两个列表仅略有不同,因为我需要将前 3 个项目与其他项目稍有不同。这现在不起作用的唯一原因是因为带有正则表达式的变量被调用了两次。知道如何将前 3 个项目(如第一个 %li 所示)与其他项目分开,而不必重复这样的所有事情吗?

%ul.list_container

  - @links.sort_by { |link| link.votes.where(:up => true).count - link.votes.where(:up => false).count }.reverse.first(3).each do |link|

  %li
    .various_containers
    %p
      = link_to link.title, "http://youtube.com/embed/#{link.url.to_s.match(/\/\/youtu.be\/(\S+)$/)[1]}/?rel=0", :class => "youtube title_link"
    = link.url_html


  - @links.sort_by { |link| link.votes.where(:up => true).count - link.votes.where(:up => false).count }.reverse.drop(3).each do |link|

  %li{:style => 'margin-bottom: 50px;'}
    .various_containers
    %p
    = link_to link.title,"http://youtube.com/embed/#{link.url.to_s.match(/\/\/youtu.be\/(\S+)$/)[1]}/?rel=0", :class => "youtube title_link" 
4

2 回答 2

1

一些东西。您有很多代码,包括 ActiveRecord 查找,在它不属于的视图中。当它到达视图时,@links应该已经变形为您想要迭代的任何简单集合。

所以视图应该是这样的:

-@prepared_links.each do |link, url_html|
  %p
    =link_to link.title, link.embedded_url, :class => "youtube title_link"
    =url_html

这意味着您需要一些额外的方法:embedded_url可以进入您的 Link 模型,并且基本上可以是"http://youtube.com/embed/.../?rel=0"您现在拥有的字符串link_to

至于url_html前三个的显示,请在您的控制器中尝试这样的操作:

def my_method
  @prepared_links = Link.sorted_by_vote_count # you'll have to add this method as well
  url_htmls = @prepared_links[0..2].map(&:url_html)
  @prepared_links = @prepared_links.zip(url_htmls)
end

这将为您提供一组准备好的链接作为配对值,其中前三个将是[some_link, url_html],前三个之后的所有内容都将是,这意味着除非它确实存在,否则[some_link, nil]不会显示任何内容。url_html

于 2012-11-15T20:21:16.973 回答
0

您可以使用 each_with_index 方法并根据索引值自定义每个循环。

%ul.list_container
  - @links.sort_by { |link| link.votes.where(:up => true).count - link.votes.where(:up => false).count }.reverse.each_with_index do |link, index|
  %li{ :style => "#{index < 3 ? 'margin-bottom: 50px;' : ''}" }
    .various_containers
    %p= link_to link.title, "http://youtube.com/embed/#{link.url.to_s.match(/\/\/youtu.be\/(\S+)$/)[1]}/?rel=0", :class => "youtube title_link"
    - if index < 3
      = link.url_html
于 2012-11-15T20:17:52.520 回答