Browse Source

Added fetch and fetch all feed buttons; deduped saving posts from feeds

master
Adrian Short 12 years ago
parent
commit
32898d161f
5 changed files with 37 additions and 10 deletions
  1. +6
    -1
      app/controllers/feeds_controller.rb
  2. +22
    -6
      app/models/feed.rb
  3. +5
    -3
      app/views/feeds/index.html.haml
  4. +2
    -0
      app/views/feeds/show.html.haml
  5. +2
    -0
      config/routes.rb

+ 6
- 1
app/controllers/feeds_controller.rb View File

@@ -85,6 +85,11 @@ class FeedsController < ApplicationController
def fetch def fetch
@feed = Feed.find(params[:id]) @feed = Feed.find(params[:id])
@feed.get @feed.get
redirect_to '/', notice: 'Feed fetched OK'
redirect_to :back, notice: 'Feed fetched OK'
end
def fetch_all
Feed.get_all
redirect_to :back, notice: 'All feeds fetched OK'
end end
end end

+ 22
- 6
app/models/feed.rb View File

@@ -5,6 +5,8 @@ class Feed
key :feed_url, String # The URL of the RSS feed, not the website that owns it key :feed_url, String # The URL of the RSS feed, not the website that owns it
key :url, String # The URL of website. Called "link" in RSS 2.0 key :url, String # The URL of website. Called "link" in RSS 2.0
key :description, String key :description, String
key :guid, String # Atom id or RSS guid
key :generator, String
key :last_fetched, Time, :default => nil key :last_fetched, Time, :default => nil
timestamps! timestamps!


@@ -16,8 +18,15 @@ class Feed
after_create :get after_create :get
# Fetch and parse feed contents from web # Fetch and parse feed contents from web

def self.get_all
Feed.all.each { |f| f.get }
end

def get def get
puts "Fetching feed: #{@url}"
Feedzirra::Feed.add_common_feed_entry_element('georss:point', :as => :point) Feedzirra::Feed.add_common_feed_entry_element('georss:point', :as => :point)
Feedzirra::Feed.add_common_feed_element('generator', :as => :generator)


feed = Feedzirra::Feed.fetch_and_parse(@feed_url) feed = Feedzirra::Feed.fetch_and_parse(@feed_url)


@@ -25,26 +34,33 @@ class Feed
:title => feed.title, :title => feed.title,
:url => feed.url, :url => feed.url,
:description => feed.description, :description => feed.description,
:generator => feed.generator,
:last_fetched => Time.now :last_fetched => Time.now
) )


feed.entries.each do |e|
# puts "#{e.title} point: #{e.point}"
feed.entries.each do |e|
latlng = e.point.split(' ') latlng = e.point.split(' ')
self.posts << Post.create(

attrs = {
:title => e.title, :title => e.title,
:url => e.url, :url => e.url,
:author => e.author, :author => e.author,
:summary => e.summary, :summary => e.summary,
:content => e.content, :content => e.content,
:published => e.published, :published => e.published,
:guid => e.id,
:loc => { :loc => {
:lng => latlng[1].to_f, :lng => latlng[1].to_f,
:lat => latlng[0].to_f :lat => latlng[0].to_f
} }
)
}
if Post.where(:url => e.url).size == 0
self.posts << Post.create(attrs)
else
Post.set({:url => e.url}, attrs)
end
end end
end end


+ 5
- 3
app/views/feeds/index.html.haml View File

@@ -1,5 +1,7 @@
%h1 Feeds %h1 Feeds


%p= link_to "Fetch all", :fetch_all, :class => "button"

%table %table
%tr %tr
%th Title %th Title
@@ -22,9 +24,9 @@
- else - else
= time_ago_in_words f.last_fetched = time_ago_in_words f.last_fetched
ago ago
%td= link_to "Fetch", fetch_feed_url(f)
%td= link_to 'Edit', edit_feed_path(f)
%td= link_to 'Delete', f, :confirm => "Delete #{f.title} and all its posts?", :method => :delete
%td= link_to "Fetch", fetch_feed_url(f), :class => "button"
%td= link_to 'Edit', edit_feed_path(f), :class => "button"
%td= link_to 'Delete', f, :confirm => "Delete #{f.title} and all its posts?", :method => :delete, :class => "button"


#new_feed #new_feed
= render 'form' = render 'form'

+ 2
- 0
app/views/feeds/show.html.haml View File

@@ -2,6 +2,8 @@


%p= @feed.description %p= @feed.description


%p= link_to "Fetch", fetch_feed_url(@feed), :class => "button"

%p %p
= pluralize(@feed.posts.size, "post") = pluralize(@feed.posts.size, "post")




+ 2
- 0
config/routes.rb View File

@@ -16,6 +16,8 @@ Apollo::Application.routes.draw do
# match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
# This route can be invoked with purchase_url(:id => product.id) # This route can be invoked with purchase_url(:id => product.id)


match '/fetch_all' => 'feeds#fetch_all', :as => :fetch_all

# Sample resource route (maps HTTP verbs to controller actions automatically): # Sample resource route (maps HTTP verbs to controller actions automatically):
# resources :products # resources :products




Loading…
Cancel
Save