2011-03-06 13 views
0

URL을 요청하는 양식이있는 작은 응용 프로그램을 RoR에 구축하고 있습니다. URL이 채워지고 제출 버튼이 눌러지면 URL을 가져 와서 제목이있는 db에 레코드를 만드는 웹 스크 레이 핑 플러그인 scrAPI (잘 작동 함)를 다운로드했습니다.도움이 필요합니다.

지금 당장 내 문제는 URL이 유효하고 scrAPI가 처리 할 수 ​​있다면 모든 것을 작동시킬 수 있다는 것입니다. 입력 된 URL이 작동하지 않는다면 예상되는 "Scraper :: Reader :: HTTPInvalidURLError"를 제공하지만 모델에서의 지식은 올바른 방식으로 오류를 전달하지 못하게합니다.

컨트롤러 :

1) 제대로 스크레이퍼 :: 리더 :: 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 

.

2) 모델에서 'uri'를 반환하고 컨트롤러 또는보기에서 사용할 수있는 방법을 알고 싶습니다.

3) 또한 모델에서 생성 된 기사의 ID를 반환하므로 컨트롤러에서 find (: last)를 사용하는 대신 악의적 인 동작처럼 사용할 수 있습니다.

당신은 require 'scrapi'
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 

해야합니다 다음과 같이

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 

그래서 당신이 컨트롤러에서이 확인 할 수 다음과 같이

답변

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의

) 2

) 당신은 @uri 사용할 수 있지만, 개인적으로 긁어라는 새로운 모델을 만들 것입니다 그리고 당신은 시도 할 때마다 긁어를 검색 할 수 있습니다.3

) 나는 질문 확실치 않지만 article.id하는 데 도움이

희망 @ 다음

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

!

+0

예외 처리 솔루션이 완벽하게 작동했습니다. – user647345

0

(1) 루비에서는 예외를 처리 할 수 ​​있습니다 귀하의 컨트롤러에 액세스 할 수 Scraper::Reader::HTTPInvalidURLError 상수.

아마 새로운 Article의 생성과 별도의 scrAPI의 메서드 호출을 만들 것입니다 :

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

(2)와 (3) 루비에서는 메소드의 마지막 문은 항상입니다 그 메소드의 반환 값. 따라서 self.getlink 메서드에서 반환 값은 새로 만든 Article 개체입니다. 당신은 당신의 컨트롤러에서이 같은 ID를 얻을 수 :

article = Article.getlink(@link) 
article_id = article.id 
당신은 당신이 원하는 결과를 얻기 위해 코드를 조금 리팩토링 (전체 청소기의 코드 샘플을)해야 할 수도 있습니다

.

+0

감사합니다. 좋은 물건입니다. – user647345