gpt4 book ai didi

ruby-on-rails - 如何重现/清理杂乱的 POST 参数以避免 delayed_job 的 YAML 序列化问题?

转载 作者:行者123 更新时间:2023-12-04 06:06:39 25 4
gpt4 key购买 nike

今天,每次我启动 delayed_job worker 时,进程都会立即安静地结束。

经过一些调查(并了解 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 尝试时发生的情况:

YAML.load(my_job.handler)

( others had the same issue before me )

找到有问题的 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: []

YAML.load(...) 成功运行。

所以我的问题是:

  1. 知道我的数据库中如何出现乱七八糟的 YAML 吗?
  2. 知道我应该如何清理我的参数以避免此类问题吗?
  3. 知道如何在单元测试中重现它吗? (以确保我确实在第 2 步中修复了它)

最佳答案

@house9 建议的详细解释:

不要执行以下操作(即使 delayed_job 的 git 仓库建议作为示例)

Notifier.delay.signup(@user)

class NotifierMailer < ActionMailer::Base
def signup(user)
end
end

因为这将尝试对 @user 进行 yaml 编码(这可能会导致问题)

但是,任何时候你有一个对象(尤其是 AR 对象)有一个 id,你应该在调用延迟作业时传递 id 并稍后检索它:

Notifier.delay.signup(@user.id)

class NotifierMailer < ActionMailer::Base
def signup(id)
@user = User.find_by_id(id)
end
end

关于ruby-on-rails - 如何重现/清理杂乱的 POST 参数以避免 delayed_job 的 YAML 序列化问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21586245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com