1

我有这个类,它的响应由“Resque”运行,我在这一行有一个错误recipient.response = response.body

#Hash:0x00000003969da0 的未定义方法 response='

我认为这是因为工人和 ActiveRecord 不能一起工作。
PS我已经加载了我的环境和这个类放在lib目录中

使用:
Ruby 1.9.2
Rails 3
Resque 1.10.0

class Msg
  def self.perform(message,sender,host, path, recipient)
    message_logger ||= Logger.new("#{Rails.root}/log/message.log")
    response = Net::HTTP.get_response(host, path)
    begin
      recipient.response = response.body
      recipient.sent_at = Time.zone.now
      recipient.save
      # Logging
      log = "Message #{
      message.sent_at}\n\tRespone:\n\t\tBody: #{response.body}\n\t\tCode: #{response.code}\n"
      message_logger.info(log)
    rescue Exception => e
      message_logger.error(e.message + '/n' + e.backtrace.inspect)
    end
  end
end
4

2 回答 2

3

Resque 使用 json 序列化。JSON 序列化不允许您在方法完整的情况下反序列化对象。

如果您有一个 Recipient 实例(名为“recipient”)并希望在方法中使用它来执行/持久响应响应,那么您应该将收件人的 id 排入队列并在调用 perform 时从持久层中获取它。

https://github.com/defunkt/resque (查看持久性部分)

Resque 在这方面与 DelayedJob/Background Job 等不同。(这就是我喜欢它的原因。同一个队列可以被多个 ruby​​ 实现共享,jruby,mri,...)

于 2010-12-20T17:13:17.393 回答
-1

这听起来根本不像 resque 和 activerecord 的问题。它说recipient你传入的参数是一个哈希。将作业排入队列的代码在哪里?您还可以查看您看到该错误消息的工作人员的日志输出,以查看传递给作业的参数是什么。

于 2010-10-22T08:19:39.423 回答