【问题标题】:Undefined method - NOMethod error with Resque gem未定义的方法 - Resque gem 的 NOMethod 错误
【发布时间】:2012-05-21 21:22:42
【问题描述】:

我正在尝试使用 resque gem 生成 xml 文件作为后台任务,这里是生成 xml 文件的类 ....

ENV['RAILS_ENV'] = ARGV.first || ENV['RAILS_ENV']
require File.expand_path(File.dirname(__FILE__) + "/../../config/environment")
require  'rubygems'
require 'builder'

class GenerateXml
  @queue = :worker

  def self.perform
    file_name = "#{Time.now.strftime('%Y_%m_%d')}_export.xml"

    xml = Builder::XmlMarkup.new(:target => file_name, :indent => 2)
    xml.instruct!(:xml, :encoding => "UTF-8")

    xml.Postings do
      Result.find_in_batches do |result|
        xml.Posting do
          xml.JobID result.job_id
          xml.JobURL result.job_url
        end
      end
    end
  end
end

我从中提取xml标签字段的结果模型是这样的

require 'active_record'

class Result < ActiveRecord::Base
  def job_id
    self.link
  end

  def job_url
    self.link
  end
end

我的问题是为什么 GenerateXml 类中的 result.job_url 和 result.job_id 无法正确映射到 Result 类?

还有一件事,Result 类位于 app/models 目录下,而 GenerateXml 类位于 lib/jobs 目录下

这是错误的痕迹。

      undefined method `job_id' for #<Array:0xb3f26738>

/home/netserv/RubymineProjects/crawler/lib/jobs/generate_xml.rb:22:in `perform'
/home/netserv/.rvm/gems/ruby-1.8.7-p357/gems/builder-3.0.0/lib/builder/xmlbase.rb:155:in `call'
/home/netserv/.rvm/gems/ruby-1.8.7-p357/gems/builder-3.0.0/lib/builder/xmlbase.rb:155:in `_nested_structures'
/home/netserv/.rvm/gems/ruby-1.8.7-p357/gems/builder-3.0.0/lib/builder/xmlbase.rb:63:in `method_missing'
/home/netserv/RubymineProjects/crawler/lib/jobs/generate_xml.rb:21:in `perform'
/home/netserv/.rvm/gems/ruby-1.8.7-p357/gems/activerecord-3.2.3/lib/active_record/relation/batches.rb:72:in `find_in_batches'
/home/netserv/.rvm/gems/ruby-1.8.7-p357/gems/activerecord-3.2.3/lib/active_record/querying.rb:8:in `__send__'
/home/netserv/.rvm/gems/ruby-1.8.7-p357/gems/activerecord-3.2.3/lib/active_record/querying.rb:8:in `find_in_batches'
/home/netserv/RubymineProjects/crawler/lib/jobs/generate_xml.rb:20:in `perform'
/home/netserv/.rvm/gems/ruby-1.8.7-p357/gems/builder-3.0.0/lib/builder/xmlbase.rb:155:in `call'
/home/netserv/.rvm/gems/ruby-1.8.7-p357/gems/builder-3.0.0/lib/builder/xmlbase.rb:155:in `_nested_structures'
/home/netserv/.rvm/gems/ruby-1.8.7-p357/gems/builder-3.0.0/lib/builder/xmlbase.rb:63:in `method_missing'
/home/netserv/RubymineProjects/crawler/lib/jobs/generate_xml.rb:19:in `perform'

【问题讨论】:

  • 解释 Generatexml 如何无法正确映射到 Result 类。你得到什么错误?堆栈跟踪?
  • 这是整个跟踪 - Undefined method - NOMethod error with Resque gem?没有行号?
  • 真的很抱歉我用跟踪输出编辑了这个问题。

标签: ruby-on-rails ruby activerecord builder resque


【解决方案1】:

find_in_batchesreturns arrays。在Postings 块内,您可以这样做:

  Result.find_in_batches do |results|
    results.each do
      xml.Posting do
        xml.JobID result.job_id
        xml.JobURL result.job_url
      end
    end
  end

但是为什么还要打扰find_in_batches呢?

【讨论】:

  • 将此添加到您的第二行就像一个魅力结果。每个都做|结果|谢谢
  • 另外你能告诉我如何将xml保存为文件吗?
【解决方案2】:

find_in_batchesreturning an Array

您必须更新或创建特定的Result,而不是更新ResultsArray,这意味着什么。

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多