Rails 3.0 парсинг XML и вставка в базу данных - PullRequest
1 голос
/ 08 сентября 2011

Я новичок в Rails и пытаюсь подключить свое приложение к стороннему API (в нем нет гема или плагина для Rails).

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

Кто-нибудь может дать инструкции или указать мне правильное направление? Приветствия.

UPDATE:

Задание на рейк:

task :fetch_flyers => :environment do

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::XML(open(url))

  events = doc.search('//event')

    events.each do |event|
      @data = Event.new(
        :name           => event.at('name').text,
        :date           => '2011-09-18',
        :time           => '17:00',
        :description    => event.at('long_description').text,
        :address        => event.at('street').text,
        :postcode       => event.at('postcode').text,   
        :price          => event.at('costs').text,
        :user_id        => 1,
        :genre_id       => 1,   
        :town_id        => 1)

    @data.save

    if @data.save
        puts "Success"
    else
        puts "This didn't save, F***"
    end
    end
end

Я указал URL в своем коде, просто скрыл его от этой вставки кода. Этот код не работает. Я не могу за свою жизнь понять, почему. Все, что я получаю, это вывод в терминале, говорящий "Это не сохранилось, F **, что означает, что по какой-то причине события не сохраняются. Может ли кто-нибудь пролить свет на это?

ОБНОВЛЕНИЕ 2:

Я проверил правильность URL-адреса и проверил, правильно ли выполняется синтаксический анализ XML с помощью:

# Printing Out the Variables to make sure they work.
    puts @name
    puts @date
    puts @time
    puts @desc
    puts @address
    puts @postcode
    puts @price
    puts @user
    puts @genre
    puts @town

.. Который успешно распечатывает значения в терминале. Тем не менее, он все равно не будет вставлен в мою базу данных.

Моя модель выглядит следующим образом:

belongs_to :user
    belongs_to :genre
    belongs_to :town

    has_attached_file :image, :styles => { :grid => '90x128#', :list => '140x200#', :full => '400x548'}
    validates_attachment_content_type :image, :content_type => ['image/jpeg', 'image/png']  
    before_post_process :normalise_file_name

  validates :name, :presence => true
  validates :date, :presence => true
  validates :time, :presence => true
  validates :description, :presence => true
  validates :address, :presence => true
  validates :town, :presence => true
  validates :postcode, :presence => true
  validates :price, :presence => true
  validates :user_id, :presence => true
  validates :viewcount, :presence => true

Мой файл Development.log просто показывает загрузку:

  [1m[35mTown Load (0.1ms)[0m  SELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1
      [1m[36mTown Load (0.1ms)[0m  [1mSELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1[0m
      [1m[35mTown Load (0.1ms)[0m  SELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1
      [1m[36mTown Load (0.1ms)[0m  [1mSELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1[0m
      [1m[35mTown Load (0.1ms)[0m  SELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1
      [1m[36mTown Load (0.1ms)[0m  [1mSELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1[0m
      [1m[35mTown Load (0.1ms)[0m  SELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1
    .......

Каждый раз, когда я пытаюсь запустить грабли. Это что-нибудь значит?

Ответы [ 3 ]

3 голосов
/ 08 сентября 2011

При использовании nokogiri вы можете указать селекторы css или xpath, например:

doc = Nokogiri::XML(xml_string)
events = doc.search('//event')
events.each do |event|
  puts event.at('short_description')
end

Кроме того, ознакомьтесь с nokogiri вводные уроки .

0 голосов
/ 09 сентября 2011

Я просто смотрю ваш журнал и обнаруживаю, что ваша модель события имеет реализацию has_many с Town Model, а также содержит столбец town_id в таблице событий. Так что я думаю, что это может быть проблемой, так как он пытается получить town_id и сохранить внешний ключ города в вашей таблице событий. Но так как он не получает ничего, то всегда происходит откат. Также, если вы хотите, попробуйте **

@data.save!

вместо

* * 1010

@data.save

спасибо

0 голосов
/ 08 сентября 2011

Я бы поставил путы после получения URL-адреса и еще один после определения events, чтобы посмотреть, возвращаются ли какие-либо данные в первом случае.Затем я проверил бы модель Event, чтобы увидеть, есть ли какие-либо проверки, которые не выполняются - требует ли модель уникальный user_id или что-то еще.Я бы также сделал данные переменными, не относящимися к экземпляру, чтобы понять, имеет ли это значение.И я бы проверил, что эти форматы времени не вызывают ошибку в модели.

...