今天,每次我开始delayed_job
工人,该进程将立即无声地终止。
经过一番调查(并找出了前台模式delayed_job
),我终于发现问题出在了方法上delayed_job
序列化我的活动记录对象在 YAML 加载部分触发异常:
Psych::SyntaxError: (<unknown>): mapping keys are not allowed in this context at line 7 column 14
from /Users/mick/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych.rb:203:in `parse'
from /Users/mick/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych.rb:203:in `parse_stream'
from /Users/mick/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych.rb:151:in `parse'
from /Users/mick/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych.rb:127:in `load'
from /Users/mick/.rvm/gems/ruby-1.9.3-p448/gems/safe_yaml-0.9.7/lib/safe_yaml.rb:144:in `load_with_options'
from (irb):111
from /Users/mick/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.16/lib/rails/commands/console.rb:47:in `start'
from /Users/mick/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.16/lib/rails/commands/console.rb:8:in `start'
from /Users/mick/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.16/lib/rails/commands.rb:41:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
这发生在什么时候delayed_job
tried:
YAML.load(my_job.handler)
(其他人在我之前也有同样的问题)
发现问题后Delayed::Backend::ActiveRecord::Job
实例,一个puts my_job.handler
会显示:
object: !ruby/ActiveRecord:MyActiveRecord
attributes:
id: 7648
... some good stuff ...
my_field: ? bla bla bla
... some other good stuff ...
method_name: :mail
args: []
我首先认为这是一个编码问题,但我意识到“?”字符是一个真正的“?”字符(即值 63),而不是对无法识别的字符的误解。
然后我尝试使用以下命令创建活动记录类的新实例my_field
的价值? Totot
但 YAML 如下所示:
object: !ruby/ActiveRecord:MyActiveRecord
attributes:
id: 7648
... some good stuff ...
my_field: ! '? bla bla bla'
... some other good stuff ...
method_name: :mail
args: []
and the YAML.load(...)
运行成功。
所以我的问题是:
- 知道我的数据库中如何出现混乱的 YAML 吗?
- 知道我应该如何清理我的参数以避免这样的问题吗?
- 知道如何在单元测试中重现这个吗? (确保我确实通过步骤 2 修复了它)