需要帮助返回

时间:2011-03-06 22:34:12

标签: ruby-on-rails exception-handling model web-scraping

我正在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),这似乎是不好的做法。

2 个答案:

答案 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

希望有所帮助!