2 votes

Comment mettre en cache un flux RSS analysé dans Rails 4.0 ?

Je travaille sur un site qui affichera une liste d'articles de blog récents sur la page d'accueil.

Quelle serait la meilleure approche pour la mise en cache et la mise à jour de la liste des articles de blog ? Je dois également m'assurer qu'il échoue de manière gracieuse dans le cas où l'url du flux est en panne ou ne peut pas être analysé pour une raison quelconque.

Je suis également à la recherche d'avis sur la manière et l'endroit où structurer ce code puisque je suis nouveau dans Rails et ses conventions (ex : dois-je créer un helper ? dois-je le placer dans un module ? etc).

Voici le code que j'ai :

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

La vue :

   #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]}"

1voto

Tout d'abord, quelques points mineurs :

  1. Votre contrôleur ne devrait probablement pas s'appeler PagesControllerController à moins qu'il ne s'agisse d'un contrôleur d'un contrôleur.
  2. J'écrirais @blog_posts.each do |post| au lieu de @blog_posts.each do |blog| . Vous itérez sur des articles, pas sur des blogs.

Ce que vous faites (télécharger et analyser des données à partir d'une source externe) n'a pas vraiment sa place dans un contrôleur. Le contrôleur sert à relier le modèle à la vue, et non à mettre en œuvre votre logique. Il n'a pas non plus sa place dans un helper, qui sert à créer des aides de vue. Le meilleur endroit pour le placer serait dans un "faux" modèle :

#!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

Cela fonctionnera, mais c'est un très mauvaise idée . Chaque fois que cette page est chargée, vous demandez également un flux externe. Cela ralentit le chargement de votre page et, si votre application devient très populaire, votre serveur sera très sollicité. Comme vous l'avez mentionné, vous manquez également de stabilité - si le flux tombe en panne pendant quelques heures, votre flux tombera également en panne.

Ce que vous voulez vraiment faire, c'est analyser ce flux toutes les heures (ou jours, minutes, 30 secondes, selon vos besoins) et enregistrer les messages dans votre base de données. Pour ce faire, créez un runner rails et utilisez chaque fois que ou des cronjobs purs pour le planifier. L'affichage des messages est alors aussi simple que leur sélection dans la base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X