2011-03-06 12 views
0

私は、URLを要求するフォームを持つ小さなアプリケーションをRoRに構築しています。 URLが入力され、送信ボタンが押されると、URLを取得してタイトル付きのレコードを作成するWebスクレイピングプラグインscrAPI(これは正常に動作しています)をダウンロードしました。返信の手助けが必要

私の問題は、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)適切スクレーパー::リーダー:: HTTPInvalidURLErrorハンドルなので、テキストは適切なエラーと表示に戻すことができます。

2)私はモデルから「uri」を返すことができ、コントローラーやビューでどのように使用できるかも知りたいと思います。

3)また、モデルで作成された記事のIDを返すので、コントローラの中でfind(:last)の代わりに使用することができます。これは悪い習慣のようです。

答えて

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は何が必要です。

2のため1)

だ)あなただけ@uri使用することができますが、個人的に私はスクレイプと呼ばれる新しいモデルを作成したいと、あなたがしようとしている各スクレイプを取得することができます。article.id @ 3

)私は質問のかなりよく分からないけど

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

その後、 役立ちます

願っています!

+0

例外処理ソリューションは完全に機能しました。 – user647345

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 
あなたが望む結果を得るために、コードを少しリファクタリング(全体クリーナーのコードサンプルを作る)する必要があるかもしれません

+0

ありがとう、いいもの。 – user647345

関連する問題