DelayedJob:如何解决“作业无法加载”的问题?

时间:2011-09-21 22:52:26

标签: ruby-on-rails ruby ruby-on-rails-3 email delayed-job

我正在使用Ruby on Rails 3.1.0和DelayedJob。网络上的很多人都遇到了“Job failed to load: uninitialized constant Syck::Syck”错误,但我想我至少发现了产生错误的内容(在我的情况下)。我有一个类似以下的ActiveModel:

class Contact
  include ActiveModel::Conversion
  include ActiveModel::Validations
  include ActiveModel::Dirty
  extend  ActiveModel::Naming
  extend  ActiveModel::Translation

  attr_accessor :full_name, :email, :subject, :message

  def initialize(attributes = {})
    attributes.keys.each do |attr|
      instance_variable_set "@" + attr.to_s, attributes[attr.to_sym]
    end
  end

  validates_presence_of :full_name, :email, :subject, :message    

  def persist
    @persisted = true
  end

  def persisted?
    false
  end
end

相关的控制器操作是:

def contact
  @contact = Contact.new(params[:contact])

  if @contact.valid?
    ::Contact::Mailer.delay.contact(@contact)

    respond_to do |format|
      format.html { redirect_to root_path }
    end
  else
    respond_to do |format|
      format.html { render :action => :contact }
    end
  end
end

我注意到,只有在我运行Job failed to load: uninitialized constant Syck::Syck 时才会出现“着名”“臭名昭着”@contact.valid?的问题。如果我像这样重新实现上述控制器动作:

def contact
  @contact = Contact.new(params[:contact])

  ::Contact::Mailer.delay.contact(@contact)

  respond_to do |format|
    format.html { redirect_to root_path }
  end
end

所有工作都按预期工作:我没有收到错误并且电子邮件已成功发送。 简而言之,当我在控制器操作中运行@contact.valid?时(我也可以在不使用if ... else语句的情况下运行它)它会生成Job failed to load误差的。我真的不明白这个与DelayedJob gem和valid?方法相关的奇怪行为。

为什么会这样?我该如何解决这个问题呢?


DelayedJob: “Job failed to load: uninitialized constant Syck::Syck”

更多信息


更新

如果我使用或不使用@contact.errors方法调试个案中的@contact.valid? ...

......何时我使用@contact.valid?方法(DelayedJob不起作用)我

#<ActiveModel::Errors:0x00000101759408 @base=#<Contact:0x000001017597f0 @full_name="Sample name", @email="foo@bar.com", @subject="Sample subject", @message="Sample message content.", @validation_context=nil, @errors=#<ActiveModel::Errors:0x00000101759408 ...>>, @messages={}>

...当使用@contact.valid?方法(DelayedJob有效)我

#<ActiveModel::Errors:0x00000101759408 @base=#<Contact:0x000001017597f0 @full_name="Sample name", @email="foo@bar.com", @subject="Sample subject", @message="Sample message content.", @errors=#<ActiveModel::Errors:0x00000101759408 ...>>, @messages={}>

请注意,在第二种情况下,@validation_context=nil不存在,并且在两种情况下都存在“嵌套”<ActiveModel::Errors:0x0000010175940 ...>语句。 这是一个错误吗

1 个答案:

答案 0 :(得分:0)

我找到了一个适合我的解决方案。您可以在Contact类中重新定义'Object#to_yaml_properties'方法,仅包含所需的属性。从而排除错误&#39;变量

def to_yaml_properties
  ['@full_name', '@email', '@subject', '@message']
end

希望这有帮助。