Réponse mise à jour et testée.
Voici un exemple en utilisant un modèle de page (et en utilisant retryable-rb):
rails génèrent nom Page d'échafaudage: string remote_url: page Chaîne: texte digest: Texte page_updated: booléen
####### app/models/page.rb
require 'digest'
require 'retryable'
class Page < ActiveRecord::Base
include Retryable
# Scrape page before validation
before_validation :scrape_content, :if => :remote_url?
# Will cause save to fail if page could not be retrieved
validates_presence_of :page, :if => :remote_url?, :message => "URL provided is invalid or inaccessible."
# Update digest if/when all validations have passed
before_save :set_digest
# ...
def update_page!
self.scrape_content
self.set_digest
self.save!
end
def page_updated?
self.page_updated
end
protected
def scrape_content
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X) ' +
'AppleWebKit/535.1 (KHTML, like Gecko) ' +
'Chrome/14.0.835.186 Safari/535.1'
# Using retryable, create scraper and get page
scraper = Mechanize.new{ |i| i.user_agent = ua }
scraped_page = retryable(:times => 3, :sleep => false) do
scraper.get(URI.encode(self.remote_url))
end
self.page_updated = false
self.page = scraped_page.content
self.name ||= scraped_page.title
self.digest ||= Digest.hexencode(self.page)
end
def set_digest
# Create new digest of page content
new_digest = Digest.hexencode(self.page)
# If digest has changed, update digest and set flag
if (new_digest != self.digest) && !self.digest.nil?
self.digest = new_digest
self.page_updated = true
else
self.page_updated = false
end
true
end
end
I Suis à peu près sûr que c'est une question sans rapport, mais je semble rencontrer un
LoadError
en essayant de
require 'mechanize'
en
rails console
et mon application de test. Je ne suis pas sûr de la cause, mais je mettrai à jour ma réponse lorsque je pourrai tester cette solution avec succès.
Assurez-vous que vous vous souvenez d'ajouter à votre application de Gemfile
:
gem 'mechanize', '2.0.1'
gem 'retryable-rb', '1.1.0'
Exemple d'utilisation:
p = Page.new(:remote_url => 'http://rubyonrails.org/')
p.save!
p.page_updated? # => false, since page hasn't been updated since creation
p.remote_url = 'http://www.google.com/' # for the sake of example
p.update_page!
p.page_updated? # => true