我正在RoR中构建一个小应用程序,其中包含一个请求URL的表单。一旦URL被填充并按下提交按钮,我已经下载了一个web抓取插件scrAPI(它工作得很好),它获取URL并在db中创建一个带有标题的记录。
我现在的问题是,如果URL是有效的,并且scrAPI能够处理它,我就能够使整个事情正常工作。如果输入的URL不起作用,它就会给出预期的“刮板::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)正确处理刮板::Reader::HTTPInvalidURLError,这样文本就可以以正确的错误返回到视图中。
2)我还想知道如何从模型返回'uri‘,并在控制器或视图中使用它。
3)此外,我还想返回在Model中创建的项目的ID,这样我就可以在控制器中使用该ID,而不是执行“查找(:last)”,这似乎是一种糟糕的实践。
发布于 2011-03-06 23:27:39
就像..。
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
endrescue_from是你所需要的。
那是1)
对于2)您只需使用@uri,但就我个人而言,我会创建一个新的模型,名为Scrape,然后您可以检索尝试中的每一次刮伤。
我不太确定这个问题,但是
@article = Article.create(:title => scraper.scrape(uri))然后是@article.id
希望这能帮上忙!
发布于 2011-03-06 23:22:42
(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您可能需要稍微重构代码,以获得所需的结果(并使代码示例更加清晰)。
https://stackoverflow.com/questions/5213945
复制相似问题