Нужна помощь в возвращении - PullRequest
0 голосов
/ 07 марта 2011

Я создаю небольшое приложение в RoR, в котором есть форма для запроса URL. После того, как URL был заполнен и нажата кнопка отправки, я скачал плагин для очистки веб-страниц 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) Кроме того, я хотел бы вернуть идентификатор статьи, созданной в модели, чтобы я мог использовать ее в контроллере вместо выполнения поиска (: last), что кажется плохой практикой.

Ответы [ 2 ]

0 голосов
/ 07 марта 2011

Что-то вроде ...

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

Надеюсь, это поможет!

0 голосов
/ 07 марта 2011

(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.Вы можете получить такой идентификатор в своем контроллере:

article = Article.getlink(@link)
article_id = article.id

Возможно, вам придется немного реорганизовать код, чтобы получить желаемые результаты (и сделать пример кода для всего очистителя).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...