我正在RoR中构建一个小应用程序,其中包含一个要求URL的表单。一旦填写了URL并按下了提交按钮,我就下载了一个web-scraping插件scrAPI(工作正常),它获取URL并在db中创建一个带标题的记录。
我现在的问题是,如果URL有效且scrAPI能够处理它,我能够完成所有工作。如果输入的URL不起作用,它会提供预期的“Scraper :: Reader :: HTTPInvalidURLError”,但是我在Model中工作的知识阻止我以正确的方式处理该错误。
控制器:
#controller
class ArticleController < ApplicationController
def savearticle
@newarticle = params[:newarticle]
@link = @newarticle["link"]
@id = @newarticle["id"]
Article.getlink(@link)
success = Article.find(:last).update_attributes( params[:newarticle] )
if success
render :partial => 'home/articlesuccess'
else
render :partial => 'home/articlebad'
end
end
end
# model
require 'scrapi'
class Article < ActiveRecord::Base
attr_accessor :getlink
def self.getlink(link)
scraper = Scraper.define do
process "title", :title => :text
result :title
end
uri = URI.parse(link)
Article.create(:title => scraper.scrape(uri))
end
end
如何:
1)正确处理Scraper :: Reader :: HTTPInvalidURLError,以便在正确错误的情况下返回文本。
2)我还想知道如何从模型返回'uri'并在控制器或视图中使用它。
3)另外,我想返回在Model中创建的文章的ID,这样我就可以在控制器中使用它,而不是使用find(:last),这似乎是不好的做法。
答案 0 :(得分:0)
(1)在Ruby中,您可以按如下方式处理任何异常:
begin
# Code that may throw an exception
rescue Scraper::Reader::HTTPInvalidURLError
# Code to execute if Scraper::Reader::HTTPInvalidURLError is raised
rescue
# Code to execute if any other exception is raised
end
因此,您可以在控制器中检查以下内容:
begin
Article.getlink(@link)
# all your other code
rescue Scraper::Reader::HTTPInvalidURLError
render :text => "Invalid URI, says scrAPI"
rescue
render :text => "Something else horrible happened!"
end
您需要在控制器中require 'scrapi'
才能使Scraper::Reader::HTTPInvalidURLError
访问不变。
我可能会创建新的Article
并且对scrAPI方法的调用是分开的:
title = scraper.scrape(uri)
Article.create(:title => title)
(2)和(3)在Ruby中,方法的最后一个语句总是该方法的返回值。因此,在self.getlink
方法中,返回值是新创建的Article
对象。您可以在控制器中获得这样的ID:
article = Article.getlink(@link)
article_id = article.id
您可能需要稍微重构一下代码以获得所需的结果(并在整个清洁程序上生成代码示例)。
答案 1 :(得分:0)
像...一样的东西。
class ApplicationController < ActionController::Base
rescue_from 'Scraper::Reader::HTTPInvalidURLError', :with => :invalid_scrape_url
private
def invalid_scrape_url
flash[:error] = 'The URL for scraping is invalid.'
render :template => 'pages/invalid_scrape_url'
end
end
rescue_from就是您所需要的。
那是1)
for 2)你可以使用@uri但我个人创建了一个名为Scrape的新模型,然后你可以检索所尝试的每个Scrape。
for 3)我不太确定这个问题,但是
@article = Article.create(:title => scraper.scrape(uri))
然后 @ article.id
希望有所帮助!