2012-11-15 69 views
1

這兩個列表只是略有不同,因爲我需要將前三項與其他項目略有不同。現在不工作的唯一原因是因爲具有正則表達式的變量被調用兩次。任何想法如何獲得前三個項目(如第一個%li中所示),而不必像這樣重複所有事情?Rails re-factor:我如何重構這個工作?

%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" 

回答

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 
+0

謝謝!它似乎應該工作,但我仍然得到一個無方法錯誤(未定義的方法'[]爲零:NilClass)就像我得到它被調用兩次。它來自正則表達式,你看到任何原因導致這種情況的原因嗎? –

+0

我明白了,謝謝尼古拉斯。現在都在工作。我的正則表達式並沒有涵蓋我作爲url的特定格式。 :) 再次感謝! –

1

有幾件事。你有很多代碼,包括ActiveRecord查找,在它不屬於的視圖中。當它進入視圖時,@links應該已被轉換爲您想要迭代的任何簡單集合。

所以認爲應該是這樣的:

[email protected]_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有現在。

至於前三顯示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將不會顯示任何內容。

+0

+1對於一個很好的重構和解釋 – awenkhh

+0

謝謝,這看起來像一個很好的答案,我只需要消化它,因爲它現在有點高於我的水平。乾杯! –

+0

讓我知道如果有什麼我可以澄清。 –