我正在使用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?
方法相关的奇怪行为。
为什么会这样?我该如何解决这个问题呢?
更多信息
更新
如果我使用或不使用@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 ...>
语句。 这是一个错误吗
答案 0 :(得分:0)
我找到了一个适合我的解决方案。您可以在Contact类中重新定义'Object#to_yaml_properties'方法,仅包含所需的属性。从而排除错误&#39;变量
def to_yaml_properties
['@full_name', '@email', '@subject', '@message']
end
希望这有帮助。