2015-09-27 54 views
0

對不起,標題很混亂,但我會在這裏詳細說明。有沒有一種方法可以使用rake任務或方法來重寫使用erb的HTML部分?

好的我的網站的用戶索引頁面我有一個熱門歌曲列表。該列表按用戶排名排序,並且該列表隨着每首歌曲聚合排名相對於彼此而改變而動態變化。

class SongratingsController < ApplicationController 
@Top100 = Rails.cache.read('Top100') 
lastSpot = @Top100.last 

def reCalcTop100 
    @Top100 = Song.where('num_stars > ?', 0).order('num_stars desc, total_score desc').limit(100) 
    Rails.cache.fetch('Top100'){@Top100} 
end 

def addRatingToSong 
    userID = params[:uid].to_i 
    songId = params[:sid].to_i 
    rVal = params[:valR].to_i 
    @averageS = [] 
    songRate = Songrating.find_by(:user_id => userID, :song_id => songId) 
    if songRate != nil 
     oldScore = songRate.rating 
     songRate.update_attributes(:rating => rVal) 
     @song = Song.find(songId) 
     score = @song.total_score - oldScore 
     newScore = score + rVal 
     averageScore = newScore/@song.songratings_count 
     @song.update_attributes(:total_score => newScore,:num_stars => averageScore) 
     @averageS[0] = averageScore 
     @averageS[1] = @song.songratings_count 
    else 
     Songrating.create!(:user_id => userID, :song_id => songId,:rating => rVal) 
     @song = Song.find(songId) 
     newScore = @song.total_score + rVal 
     averageScore = newScore/@song.songratings_count 
     @song.update_attributes(:total_score => newScore,:num_stars => averageScore) 
     @averageS[0] = averageScore 
     @averageS[1] = @song.songratings_count 
    end 

    if newScore > lastSpot.total_score && averageScore > lastSpot.num_stars 
     reCalcTop100 
    end 

    if request.xhr? 

    render :json => { 
         :starData => @averageS 

        } 
    end 


end 

正如你可以在這兩張照片見下面我有一個局部視圖,顯示這個名單,但現在我有列表每次生成的用戶登錄到主頁。但是因爲這個列表並不是用戶唯一的,所以我覺得我正在浪費時間來重新生成這個列表。

enter image description here

enter image description here

理想我想生成和寫一個靜態的HTML部分僅在TOP100排行榜的變化,但我真的不知道如何做到這一點。

謝謝。

回答

1

沒錯只使用ERB

vars = OpenStruct.new({some_var: some_val}) 
rendered_html = ERB.new(File.read("#{Rails.root}/app/templates/embed_code.html.erb")).result(vars.instance_eval { binding }) 

這將使渲染HTML中rendered_html變量從那裏你可以把它寫入一個文件或做任何你想要的。這應該在ruby類或rake任務afaik的上下文中工作。

該變量被傳遞給模板,可以在模板中用作<%= some_var%>。


現在我已經回答了您的實際問題,我認爲更好的解決方案是使用Rails.cache來緩存呈現的數據。

凡是需要很長的時間可以用

result = Rails.cache.fetch "some_cache_key" do 
    # things you want to cache 
end 

這個被緩存將緩存塊,並返回其造成的。如果將來存在非緩存的數據,它將僅從緩存中返回,如果緩存爲空或陳舊,它將重新執行該塊並將其返回結果。


終於在FO控制器你可以使用動作緩存是多一點的手離開上下文。

參見:http://guides.rubyonrails.org/caching_with_rails.html瞭解更多詳情。

+0

所以我可以緩存HTML文件或只是數據,因爲我已經緩存了Top100查詢結果,並且使用了一個幫助器方法,它從緩存中的100列表中返回前10個對象的實例變量。 [緩存初始化工具](https://github.com/MKwenhua/myOtherCv/blob/master/config/initializers/queryDB.rb),[helper method getTop100 line48](https://github.com/MKwenhua/myOtherCv/blob /master/app/helpers/users_helper.rb),[這是erb視圖部分](https://github.com/MKwenhua/myOtherCv/blob/master/app/views/users/_topmusiclabel.html.erb) – Pete

相關問題