【问题标题】:Need help returning需要帮助返回
【发布时间】:2011-03-06 22:34:12
【问题描述】:

我正在 RoR 中构建一个小型应用程序,它有一个请求 URL 的表单。填写完 URL 并按下提交按钮后,我下载了一个网络抓取插件 scrAPI(工作正常),它获取 URL 并在 db 中创建带有标题的记录。

我现在的问题是,如果 URL 有效并且 scrAPI 能够处理它,我就能够使整个工作正常进行。如果输入的 URL 不起作用,它会给出预期的“Scraper::Reader::HTTPInvalidURLError”,但我对模型工作的了解使我无法以正确的方式处理该错误。

控制器:

#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) 另外,我想返回在模型中创建的文章的 ID,以便我可以在控制器中使用它,而不是执行 find(:last),这似乎是一种不好的做法。

【问题讨论】:

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


    【解决方案1】:

    类似...

    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)

    对于 2) 你可以只使用 @uri 但我个人会创建一个名为 Scrape 的新模型,然后你可以检索每个尝试的 Scrape。

    对于 3) 我不太确定这个问题,但是

    @article = Article.create(:title => scraper.scrape(uri))
    

    那么 @article.id

    希望有帮助!

    【讨论】:

      【解决方案2】:

      (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
      

      您可能需要稍微重构代码以获得您想要的结果(并使代码示例整体更简洁)。

      【讨论】:

        猜你喜欢
        • 2013-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 2011-05-05
        • 2017-07-29
        相关资源
        最近更新 更多