【问题标题】:How to Import XML Data in Rails 5如何在 Rails 5 中导入 XML 数据
【发布时间】:2017-08-01 08:02:05
【问题描述】:

我有想要导入数据库的 xml 数据。我正在尝试使用 nokogiri 宝石。我编写了一个名为 xml_data.rb 的文件。当我在命令行上运行>ruby xml_data.rb 时,我收到以下错误:

xml_data.rb:8:in block in <main>': uninitialized constant Job (NameError) from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/nokogiri-1.7.0.1-x86-mingw32/lib/nokogiri/xml/node_set.rb:187:inblock in each' 来自 C:/RailsInstaller/Ruby2.3.​​0/lib/ruby/gems/2.3.0/gems/nokogiri-1.7.0.1-x86-mingw32/lib/nokogiri/xml/node_set.rb:186:in upto' from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/nokogiri-1.7.0.1-x86-mingw32/lib/nokogiri/xml/node_set.rb:186:ineach' 来自 xml_data.rb:7:in `'

我不确定我是否了解如何正确执行此操作。下面是xml_data.rb文件:

require 'nokogiri'

OLD_DATA = 'data/old_data.xml'

doc = File.open(OLD_DATA) {|f| Nokogiri::XML(f)}

doc.css('request').each do |node|
    Job.create(
        :last_name => node['name'],
        :telephone => node['phone'],
        :street_address => node['address'],
        :city => node['city'],
        :state => node['state'],
        :zip => node['zip'],
        :email => node['email'],
        :au_chog => node['chogAu'],
        :person_type => node['affil'],
        :research_use => node['use'],
        :subject => node['subject'],
        :notes => node['note'],
        :start_date => node['startDate'],
        :end_date => node['addDate'],
        :complete => true,
        :time_spend => node['hours']
    )
end

红宝石:v2.3.3 导轨:v5.0.1

更新

我将这段代码重写为 rake 任务。但是,我没有这样做。当我运行该任务时,我遇到了几个与 XML 语法有关的语法错误,这是正确的。以下是更新后的代码:

require 'nokogiri'

namespace :db do
  namespace :seed do

    desc 'Add old data to database'
    task :import_data => :environment do


        OLD_DATA = "#{Rails.root}/lib/assets/data/old_data.xml"

        doc = Nokogiri::XML(File.open(OLD_DATA)) do |config|
            config.options = Nokogiri::XML::ParseOptions::STRICT
        end

        doc.css("request").each do |node|
            Job.create(
                :last_name => node['name'],
                :telephone => node['phone'],
                :street_address => node['address'],
                :city => node['city'],
                :state => node['state'],
                :zip => node['zip'],
                :email => node['email'],
                :au_chog => node["chogAu"],
                :person_type => node['affil'],
                :research_use => node['use'],
                :subject => node['subject'],
                :notes => node['note'],
                :start_date => node['startDate'],
                :end_date => node['addDate'],
                :complete => true,
                :time_spend => node['hours']
            )
        end
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby xml ruby-on-rails-5 rake-task


    【解决方案1】:

    重写为 rake 任务。

    require 'nokogiri'
    
    namespace :db do
        namespace :seed do
    
            desc 'Add old data to database'
            task :import_data => :environment do
    
                OLD_DATA = "#{Rails.root}/lib/assets/data/old_data.xml"
    
                doc = Nokogiri::XML(File.open(OLD_DATA)) do |config|
                    config.options = Nokogiri::XML::ParseOptions::STRICT
                end
    
                doc.css("request").each do |node|
                    Job.create(
                        :last_name => node['name'],
                        :telephone => node['phone'],
                        :street_address => node['address'],
                        :city => node['city'],
                        :state => node['state'],
                        :zip => node['zip'],
                        :email => node['email'],
                        :au_chog => node["chogAu"],
                        :person_type => node['affil'],
                        :research_use => node['use'],
                        :subject => node['subject'],
                        :notes => node['note'],
                        :start_date => node['startDate'],
                        :end_date => node['addDate'],
                        :complete => true,
                        :time_spend => node['hours']
                    )
                end
            end
        end
    end
    

    【讨论】:

    • 我不是。我有一条导致问题的线路。当我发现它时,我更新了帖子。
    【解决方案2】:

    作业未定义,因为您实际上并未在 Rails 环境中运行它。

    添加

    require File.expand_path(File.dirname(__FILE__) + 'config/environment')
    

    【讨论】:

    • 好的。这是我现在收到的错误 C:/RailsInstaller/Ruby2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in require': cannot load such file -- C:/Sites/arch_record_keeper/config/environments (LoadError) from C:/RailsInstaller/Ruby2.3.​​0/lib/ruby/2.3。 0/rubygems/core_ext/kernel_require.rb:55:in require' from xml_data.rb:1:in
      '`
    • 这个文件在哪里?它在rails主目录中吗?
    • 不是。它位于应用程序的 app/assets 目录中。
    • 您几乎不应该在 app/assets 中有 .rb 文件。对于这样一个负责将数据插入数据库的文件,我建议将其放在 lib/.或者,将其编写为 .rake 文件并将其放在 lib/tasks/ 中。如果它是一个 rake 任务,那么当您启动它时,您将预先加载 rails 环境,您将不必在应用程序之外尝试加载 rails 的兔子洞。
    • @Glyoko 我将代码重写为 rake 任务,但现在我遇到了一堆语法错误。我将代码作为更新发布。
    【解决方案3】:

    如果你不在轨道上,你可以尝试这样的事情。

    require 'nokogiri'
    require 'active_record'
    
    ActiveRecord::Base.establish_connection(
      adapter:  'mysql2', # or 'postgresql' or 'sqlite3' or 'oracle_enhanced'
      host:     'localhost',
      database: 'your_database',
      username: 'your_username',
      password: 'your_password'
    )
    
    class Job < ActiveRecord::Base
    end
    
    class ExampleData
      attr_reader :file
    
      def initialize(file)
        @file = file
      end
    
      def xml
        Nokogiri::XML(open(file))
      end
    
      def create_jobs
        xml.css('request').each do |node|
          Job.create(
            :last_name => node['name'],
            :telephone => node['phone'],
            :street_address => node['address'],
            :city => node['city'],
            :state => node['state'],
            :zip => node['zip'],
            :email => node['email'],
            :au_chog => node['chogAu'],
            :person_type => node['affil'],
            :research_use => node['use'],
            :subject => node['subject'],
            :notes => node['note'],
            :start_date => node['startDate'],
            :end_date => node['addDate'],
            :complete => true,
            :time_spend => node['hours']
        )
        end
      end
    
    
      file = File.dirname(__FILE__) + "/data/old_data.xml"
      example_data = ExampleData.new(file)
      example_data.create_jobs
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 2012-07-07
      • 2017-04-02
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      相关资源
      最近更新 更多