2016-02-08 58 views
0

右偏,現在我有一個幫手:Rake任務,以創建Rails的JSON數據

def blog_posts 
    Rails.cache.fetch("blog_posts", :expires_in => 30.minutes) do 
    url = URI('http://www.xxxxxxxx.com/blog/?json=get_recent_posts') 
    request = Net::HTTP.get(url) 
    response = JSON.parse(request) 
    response['posts'].take(4) 
    end 
rescue => e 
    logger.error "Error retrieving blog posts!" 
    logger.error "#{e.message}\n#{e.backtrace.join("\n")}" 
    [] 
end 

而且我的觀點:

<% blog_posts.each do |blog| %> 
    <div class="col col-3"> 
    <a class="search-page-links" href="<%= blog['url'] %>" target="_blank"> 
     <img class="post-image" src="<%= blog['thumbnail'] %>"> 
     <br/><br/> 
     <%= blog['title'].html_safe %> 
    </a> 
    </div> 
<% end %> 

工作正常。除了我們不希望數據在頁面加載時被拉取,因爲我們不能總是依靠源代碼。該計劃是將Rake任務添加到部署過程中,以便靜態數據可以在每個部署中的部分導軌上進行更新,並將其部署到視圖中。我怎麼能這樣做呢?

+0

我建議您將提取的數據存儲在數據庫中,而不是。每次你想更新這個視圖時更新你的應用程序代碼庫看起來很痛苦。 –

+0

假設數據庫現在不是一個選項(不是「我的」應用程序,不是我的規則排序情況)。我們每天部署,這部分只會實際每週更改,因爲'最近的帖子'不是很頻繁。所以我們不會部署更新部分。相反,當我們部署我們想部分更新如果碰巧有變化/更新與帖子 – user3127502

回答

0

我做什麼

耙子任務:

namespace :blog do 

    task :pull do 
    tmp = "tmp/blog_posts" 

    def fetch_blog_posts 
     json = open('http://www.xxxxx.com/blog/?json=get_recent_posts').read 
     hash = JSON.parse(json) 
     hash['posts'].take(4) 
    end 

    def download_blog_images 
     fetch_blog_posts.each_with_index do |blog, index| 
     File.open("tmp/#{index}.jpg", 'wb') do |f| 
      f.write open("#{blog['thumbnail']}").read 
     end 
     puts "Downloaded #{(index.to_i+1).ordinalize} Image" 
     end 
    end 

    def retrieve_blog_data 
     puts 'Retrieving blog data from Wordpress' 
     fetch_blog_posts 

     File.open("tmp/blog_posts.json", "w+") do |f| 
     f.write(JSON.pretty_generate(fetch_blog_posts)) 
     puts 'Saved json data' 
     end 
     download_blog_images 
    end 

    retrieve_blog_data 
    puts 'Done retrieving blog posts' 
    end 

end 

助手:

module BlogHelper 

    def blog_posts 
    if Rails.env.development? 
     json = open('http://xxxxx/blog/?json=get_recent_posts').read 
    else 
     json = File.read("tmp/blog_posts.json") 
    end 
    hash = JSON.parse(json) 
    hash['posts'].take(4) 
    end 

end 

控制器:

def home 
    @blog_posts = blog_posts 
end 

查看:

<% @blog_posts.each_with_index do |blog, index| %> 
    # markup for each post... 
<% end %> 
0

創建partials只是聽起來像是最糟糕的解決方案,因爲您正在創建大量的代碼重複,並且可能是一個巨大的slug(部署的代碼庫)。如果必須將JSON數據保存到磁盤並在需要時使用片段緩存。

其他替代方法是使用基於鍵/值或基於JSON的存儲,而不是將數據存儲在代碼庫中(這幾乎總是一個壞主意)。

我會和客戶或制定規則的人坐下來解釋,這將是一個相當大的維護問題,並建議一個實際上可行的解決方案。

+0

謝謝你的建議,我完全同意你的看法。但是,我的問題仍然沒有答案。即使我選擇採取其他幾種更明智的方法之一,問題依然存在。我想知道如何做到這一點。如果我們假裝今天是一個假期,我們應該想方設法做他們不應該做的事情,而我認爲這是我參加假期的方式,那會有幫助嗎?因爲我正在尋找我的實際問題的答案。 – user3127502

+0

那麼它可能會涉及渲染一個主視圖與其中的數據並將生成的HTML寫入磁盤。你會想看看'rspec-rails'如何在視圖規範中獨立呈現視圖(和部分)。然後,您需要對部分的任何模板鏈接執行相同的操作。 – max

+0

它可能需要10倍,只要它像一個理智的人一樣。但是,嘿 - 你的假期。 – max