Rails重新考虑因素:我如何重构这个?

时间:2012-11-15 19:59:58

标签: ruby-on-rails

这两个列表只是略有不同,因为我需要处理前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" 

2 个答案:

答案 0 :(得分: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可以放在您的链接模型中,基本上只是"http://youtube.com/embed/.../?rel=0"link_to的{​​{1}}字符串。

至于前三个显示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不会显示任何内容{1}}除非它确实在那里。

答案 1 :(得分: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