2

我正在开发一个网站,该网站将在主页上显示最近的博客文章列表。

如何缓存和更新博客文章列表的最佳方法是什么?我还需要确保它在提要 url 关闭或由于任何原因无法解析的情况下正常失败。

由于我是 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]}"
4

1 回答 1

1

首先,一些小问题:

  1. 您的控制器可能不应该被命名PagesControllerController,除非它实际上是控制器的控制器。
  2. 我会写@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 秒,无论您需要什么)解析该提要并将帖子保存在您的数据库中。为此,请创建一个 rails runner 并使用when 或 pure cronjobs 来安排它这使得显示帖子就像从数据库中选择它们一样容易。

于 2013-08-03T23:11:29.970 回答