Соскоб с Nokogiri для создания объекта из модели - PullRequest
0 голосов
/ 20 марта 2012

Я использую Nokogiri для анализа названия и цены сделок. Я создал задачу rake для сохранения информации о разборе, создав новую сделку из модели traveldeal.

Однако, когда я запускаю команду rake, новая сделка не создается и не сохраняется, даже при отсутствии ошибок. Я удостоверился, что включил resource :traveldeals в мои маршруты.

Я думаю, это как-то связано с действиями в моем контроллере traveldeals. Любые советы?

travel_deals.rake

desc "Fetch travel deals"
task :fetch_travel => :environment do

require 'nokogiri'
require 'open-uri'

  #Traveldeal.find_all_by_price(nil).each do |traveldeal|     <<WRONG!
    url = "http://www.groupon.com/deals/ga-flamingo-conferences-resort-spa?c=all&p=0"
    doc = Nokogiri::HTML(open(url))


    title = doc.at_css("#content//h2/a").text
    price = doc.at_css("#amount").text[/[0-9\.]+/]
    link = doc.at_css("#content//h2/a")[:href]

    Traveldeal.create(:title => title, :price => price, :url => link)
  #end
end

traveldeals_controller.rb

class TraveldealsController < ApplicationController

  def show
    @user = current_user
    @traveldeal = Traveldeal.find(params[:id])     
  end

  def new
    @traveldeal = Traveldeal.new
  end

  def create
  @traveldeal = Traveldeal.new(params[:traveldeal])
  end
end

traveldeal.rb

class Traveldeal < ActiveRecord::Base
attr_accessible :title, :price, :url
  validates :title, :presence => true
  validates :price, :presence => true
  validates :url, :presence => true
end

спасибо!

РЕДАКТИРОВАТЬ: Внесены изменения в ответ ксоль.

РЕДАКТИРОВАТЬ: теперь я получаю эту ошибку в моем файле development.log.

[1m[36mTraveldeal Load (0.3ms)[0m [1mSELECT "traveldeals".* FROM "traveldeals" WHERE "traveldeals"."price" IS NULL[0m

1 Ответ

1 голос
/ 20 марта 2012

new создает объект, но не сохраняет его в базе данных. Либо используйте create вместо этого, либо вызовите save явно

EDIT

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

...