Pregunta

Antecedentes: estoy jugando un poco con el feedzirra plug-in en un carriles de aplicación, y que estoy tratando de utilizar tanto los descriptores de acceso de alimentación y de entrada de la alimentación analizada en una sola vista.

Para lograr esto, he creado dos modelos: alimentación y feed_entry. Son los siguientes:

feed.rb:

class Feed < ActiveRecord::Base
  attr_accessible :title, :url, :feed_url, :last_modified, :guid
  has_many :feed_entries

  def self.update_from_feed(feed_url)
    feed = Feedzirra::Feed.fetch_and_parse(feed_url)
    add_feed(feed)
    FeedEntry.add_entries(feed.entries)
  end


  private

  def self.add_feed(feed)
    unless exists? :guid => feed.id
      create!(
        :title          => feed.title,
        :url            => feed.url,
        :feed_url       => feed.feed_url,
        :last_modified  => feed.last_modified,
        :guid           => feed.id
      )
    end
  end
end

feed_entry.rb:

class FeedEntry < ActiveRecord::Base
  attr_accessible :title, :url, :author, :summary, :content, :published, :guid
  belongs_to :feed

  def self.add_entries(entries)
    entries.each do |entry|
      unless exists? :guid => entry.id
        create!(
          :title        => entry.title,
          :url          => entry.url,
          :author       => entry.author,
          :summary      => entry.summary,
          :content      => entry.content,
          :published    => entry.published,
          :guid         => entry.id
        )
      end
    end
  end
end

Cuando la intención es llamar Feed.update_from_feed (FEED_URL) como una tarea programada. En realidad, estoy esperando para tener el trabajo de cron llamar a esta función mediante introducción de alimentación múltiple; pero pensé que había que conseguir uno que trabaja en primer lugar. En aras de la prueba, estoy actualmente llamar a esta función desde la consola.

Preguntas:

NoMethodError: undefined method `id' for #<Feedzirra::Parser::RSS:0x00000100bcb0f0>
  1. Esto puede parecer muy simple, pero en llamar a la función update_from_feed, me sale el error anterior en mi consola. Aunque nuevo en Ruby y Rails, que estaba bajo la impresión de que cada nueva entrada en una tabla se da un identificador que se puede hacer referencia - en este escenario, por feed.id. Me estoy perdiendo algo aquí?

  2. Es mi enfoque 2-modelo para el uso de este plugin una dirección buena para entrar? Como yo no soy capaz de verificar el resto de mis enfoque funciona hasta que desentrañar la pregunta 1, pensé que pediría un consejo sobre las mejores prácticas en la media hora.

  3. El resto de mi plan es utilizar los descriptores de acceso de alimentación y de entrada del plugin dentro de un solo controlador, y luego hacer referencia esas variables dentro de la vista relativa de alguna manera. ¿Es así como debería ser el percibir la arquitectura MVC y usarlo de una manera REST? Si es así, ¿cómo hacer referencia a los métodos de acceso de alimentación y de entrada en la vista FeedReader?

Esto es lo que el controlador FeedReader se vería así:

class FeedEntriesController < ApplicationController
  def index
    @feed_entries = FeedEntry.all
    @feeds = Feed.all
  end
end

Sé que esto era una perra de un puesto, pero cualquier ayuda realmente sería apreciada.

¿Fue útil?

Solución

Hay un par de defectos en su enfoque.

En primer lugar, cuando actualice su alimentación, se está comprobando si existe o no (muy bien), pero luego no se trata de la posibilidad de que lo hace y luego intenta recoger nuevas fuentes de todos modos. Es necesario algo así como;

feed = Feed.find_by_url(incoming_url) # try loading an existing feed first
feed = Feedzirra::Feed.fetch_and_parse(feed_url) if !feed # if not, create a new one

Si se asume que el último comando Feedzirra es el de crear un nuevo feed. No puedo recordar!

Los dos modelos idea parece un enfoque razonable. Cuando se accede a sus feeds a través de los controladores más tarde, probablemente debería tratar los recursos anidados. A continuación, la URL sería algo así;

/feed/1/entries

Y su controlador serían algo así como;

@feed = Feed.find(params[:feed_id])
@entries = @feed.entries

No he respondido a todas sus preguntas, pero espero que es un comienzo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top