[Ror-es] Añadiendo datos automáticamente

Imobach González Sosa imobachgs at banot.net
Sat Dec 30 09:07:30 GMT 2006


El Sábado, 30 de Diciembre de 2006 01:44, Coquito Zen escribió:
> Buenas noches a todos!
>
> Llevo un rato probando y probando, y ni San Google ni los cientos de
> cafés que he tomado ya, me han hecho encontrar la solución a estre
> problema que tengo delante. Si alguno pudiera aconsejarme con lo que
> hacer, estaría eternamente agradecido.
>
> La cuestión es la siguiente, tengo un pequeño codigo que coje los datos
> de un RSS y los presenta en pantalla (un muy simple lector RSS). La
> cuestión es que me gustaría que automáticamente cada cierto tiempo, o
> almenos cada vez que accediera al action, tomara los datos del RSS
> (título y contenido) y los agregara a la base de datos, exactamente a la
> tabla news (id, title, content).
>
> El codigo del lector es el siguiente:
>
>   def index
>     feed_url = 'http://rss.elmundo.es/rss/descarga.htm?data2=4'
>     output = "<h1>My RSS Reader</h1>"
>     open(feed_url) do |http|
>       response = http.read
>       result = RSS::Parser.parse(response, false)
>       result.output_encoding = "iso-8859-1"
>       output += "Feed Title: #{result.channel.title}<br />"
>       result.items.each_with_index do |item, i|
>         output += "<p><b>#{i+1}. #{item.title}</b><br
> />#{item.description}<p>" if i < 10
>       end
>     end
>     render_text output
>   end
>
> Supongo que para hacerlo, es tomar las strings de item.title y de
> item.description de cada post y irlas guardando progresivamente. Lo que
> sucede con esto, es que no se como aplicarlo, ahora mismo tengo un
> enorme "cacao" en la cabeza que no me deja ni razonar.

No conozco el resto de tu aplicación, así que la solución que se me ocurre a 
lo mejor no la puedes llevar a cabo en tu caso. Pero bueno, espero que te 
sirva.

Yo empezaría por crear un par de modelos Feed y FeedItem (que supongo que tú 
ya tienes algo parecido). El primero representa una fuente RSS (un feed) y el 
segundo cada elemento que podamos leer.

El siguiente paso sería simplificar el controlador, quitando el código 
referente a la lectura de los RSS. ¿Dónde lo ponemos? Pues siguiendo la 
propuesta[1] de Jamis Buck y Michael Koziarsky, podríamos crear una clase 
FeedImporter (que pondríamos en lib/). Así, el modelo Feed sería algo como:

class Feed < ActiveRecord::Base
  has_many :feed_items

  def import!
    FeedImporter.import!(self)
  end
end

La clase FeedImporter se encargará de instanciar los nuevos FeedItem según sea 
necesario. Si quieres, puedes prescindir de esta clase (FeedImporter) e 
implementar esta funcionalidad en Feed, pero el enfoque de Koziarsky y Jamis 
hace que tus modelos permanezcan simples.

En cuanto al controlador, podrías hacer algo como:

app/controllers/feed_controller.rb

def view_feed
  @feed = Feed.find(params[:id])
  @feed.import!
  @items = feed.items
end

Y en la vista, sólo tienes que recorrer los elementos (@items):

app/feeds/view_feed.rhtml:

<%= render :partial => "item", :collection => @items %>

app/feeds/_item.rhtml

<%=h item.title %>
<%=h item.body %>

> Gracias a todos por la ayuda y el tiempo que podais tomar al leer esto.

Espero que te haya servido de algo.

> Saludos,

Un saludo.

[1] http://www.therailsway.com/2006/12/18/importing-files

-- 
_o)  Imobach González Sosa
//\  email: imobachgs at banot dot net
V_/_ jid: osoh at jabberes dot org
url: http://www.banot.net/~osoh/
blog: http://devnull.blogs.banot.net
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.simplelogica.net/pipermail/ror-es/attachments/20061230/4782e438/attachment.pgp 


More information about the Ror-es mailing list