2013-08-03 35 views
2

我正在一个网站上显示主页上最近的博客文章列表。如何在Rails 4.0中缓存解析的RSS提要?

如何缓存和更新博客文章列表的最佳方法是什么?我还需要确保它在馈送网址已关闭或无论何种原因无法解析的情况下优雅地失败。因为我是Rails及其约定的新手(例如:我应该创建一个助手吗?应该在模块中吗?等等),我还在寻找关于如何以及在何处构造此代码的意见。

这里是我的代码:

require 'simple-rss' 
require 'open-uri' 

class PagesController < ApplicationController 
    def home 

    rss = SimpleRSS.parse(open("#{Settings.my_site.blog_feed}")) 
    @blog_posts = [] 
    rss.channel.items[0..4].each_with_index do |item, index| 
     @blog_posts[index] = { 
     title: item.title, 
     link:  item.link, 
     pub_date: item.pubDate 
     } 
    end 

    render layout: 'home' 
    end 

的观点:

#blog-updates 
    %h2 
     %span.sprite> 
     Latest Blog Posts 
    %ul 
     - @blog_posts.each do |blog| 
     %li 
      =link_to truncate("#{blog[:title]}".html_safe, length: 75, seperator: ' ', omission: "&hellip;"), "#{blog[:link]}" 

回答

1

首先,一些小的点:

  1. 你的控制器可能不应该被命名为PagesControllerController,除非它实际上控制器的控制器。我写@blog_posts.each do |post|而不是@blog_posts.each do |blog|。您正在迭代帖子,而不是博客。

你在做什么(从外部源下载和解析数据)并不属于控制器。控制器用于连接模型和视图,而不是实现您的逻辑。它也不属于助手,因为那些是用来创建视图助手的。最好的地方放这将是一个“假”的模式:

#!app/models/blog_post.rb 
class BlogPost 
    attr_accessor :title, :body, :url, :etc 

    def self.all 
     // fetch and parse the posts into an array of BlogPosts 
    end 
end 

这是可行的,但它是一个非常糟糕的主意。每次加载页面时,您还需要一个外部提要。这会让你的网页加载速度变慢,如果你的应用程序变得非常流行,它将会对你的服务器造成严重的负担。正如你所提到的,你也失去了稳定性 - 如果饲料停机几个小时,饲料也会下降。

你真正想要做的是每小时(或每天,每分钟,30秒,无论你需要什么)解析该提要,并将这些帖子保存到数据库中。要做到这一点,创建一个滑轨跑步者,并使用whenever或纯cronjobs来安排它。这使得显示帖子像从数据库中选择一样简单。