首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要帮助返回

需要帮助返回
EN

Stack Overflow用户
提问于 2011-03-06 22:34:12
回答 2查看 86关注 0票数 0

我正在RoR中构建一个小应用程序,其中包含一个请求URL的表单。一旦URL被填充并按下提交按钮,我已经下载了一个web抓取插件scrAPI(它工作得很好),它获取URL并在db中创建一个带有标题的记录。

我现在的问题是,如果URL是有效的,并且scrAPI能够处理它,我就能够使整个事情正常工作。如果输入的URL不起作用,它就会给出预期的“刮板::Reader::HTTPInvalidURLError”,但我在Model中工作的知识使我无法以正确的方式处理该错误。

控制器:

代码语言:javascript
运行
复制
#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)”,这似乎是一种糟糕的实践。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-06 23:27:39

就像..。

代码语言:javascript
运行
复制
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,然后您可以检索尝试中的每一次刮伤。

我不太确定这个问题,但是

代码语言:javascript
运行
复制
@article = Article.create(:title => scraper.scrape(uri))

然后是@article.id

希望这能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2011-03-06 23:22:42

(1)在Ruby中,您可以按以下方式处理任何异常:

代码语言:javascript
运行
复制
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

因此,您可以在控制器中检查这一点,如下所示:

代码语言:javascript
运行
复制
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方法的调用分开:

代码语言:javascript
运行
复制
title = scraper.scrape(uri)
Article.create(:title => title)

(2)和(3)在Ruby中,方法的最后一个语句总是该方法的返回值。因此,在self.getlink方法中,返回值是新创建的Article对象。您可以在控制器中获得这样的ID:

代码语言:javascript
运行
复制
article = Article.getlink(@link)
article_id = article.id

您可能需要稍微重构代码,以获得所需的结果(并使代码示例更加清晰)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5213945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档