2011-09-08 49 views
1

我是Rails的新手,并试图将我的应用程序连接到第三方API(它没有Rails的gem或插件)。Rails 3.0解析XML并插入到数据库中

理想情况下,我想要做的就是解析数据(我听说过关于Nokogiri的好东西,但不知道如何使用它来做我想做的事情,而不是因为缺乏尝试),然后将其插入到数据库中。

任何人都可以提供指导或指向正确的方向吗? 干杯。

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 * *这意味着由于某种原因没有被保存的事件。任何人都可以提供一些线索这光?

UPDATE 2:

我检查的网址是否正确,并已通过检查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 

..这成功地打印出在终端的值不过,它仍不会插入我nto我的数据库。

我的模型如下:

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 
    ....... 

每次我尝试运行rake任务。这是否意味着什么?

回答

3

使用时引入nokogiri您可以指定CSS或XPath选择,如:

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

此外,检查出引入nokogiri intro tutorials

+0

如果我打算使用Rails 3利用这一点,在那里我会把这个instaed?特别是因为我希望每周都能像常规的cron工作那样运行? – Ammar

+0

首先,你应该把'gem'nokogiri''加入Gemfile中。为了做例行公事,你应该写耙子任务,并把处理代码放在那里或者放在模型中。 – taro

+0

我用我最近的发现更新了我的问题,请查看! – Ammar

0

我把得到URL后puts和另一个定义events,看是否有在第一时间返回任何数据之后。然后我会检查事件模型,以查看是否有未得到满足任何验证 - 模型是否需要一个独特的USER_ID什么的。我也会让数据成为一个非实例变量,看看是否有所作为。我会检查那些时间格式不会导致模型中的错误。

+0

嗨,我已经更新了我的问题,你介意看看它,看看你是否可以找到任何东西 – Ammar

0

我刚才看到你的日志,并找出你的事件模型也有镇型号的has_many维吾尔语,也包括town_id列在你的事件表。 所以我觉得作为其试图获得town_id并保存镇在事件表的外键,可能是这个问题。但因为它没有得到,所以总是回滚。 另外,如果你想然后尝试**

@ data.save!

@ data.save

感谢