【问题标题】:after_commit block executes when parameter uses hashrocket syntax, but not when it uses colon syntaxafter_commit 块在参数使用 hashrocket 语法时执行,但在使用冒号语法时不执行
【发布时间】:2014-03-24 19:47:13
【问题描述】:

我有一个模型大量使用 activerecord 生命周期回调。我正在使用 after_commit 回调来执行需要主键才能在创建时运行的 sidekiq 作业。

after_commit on: :create do
  async_process
end

块内的代码永远不会运行。

但是,当我这样做时

after_commit :on => :create do
  async_process
end

代码运行良好。

据我了解,这两条不同的行应该以完全相同的方式解释。我错过了什么?

我正在使用 ruby​​ 2.0.0p247,Rails 3.2.17。

【问题讨论】:

  • 您确定您使用的是on: :create 而不是on: create
  • 看起来应该可以正常运行。此外,您不需要 do 块。你可以在 after_commit :async_process, on: :create 上写
  • @muistooshort 是的,但猜对了。 emcanes 它适用于没有 do 块的冒号语法,以及带有 do 块的 hashrocket 语法。

标签: ruby-on-rails ruby activerecord ruby-2.0 hashrocket


【解决方案1】:

它适用于我使用相同的 RubyRails 版本。或者,您可以尝试使用另一种可接受的语法:

after_commit :async_process, on: :create

【讨论】:

  • @dfried 你找到weird 的东西了吗?你尝试过替代语法吗?
  • 它适用于替代语法,但仍然不适用于我原来应该相同的语法。
【解决方案2】:

我发现使用别名(而不是 :on 为我解决了这个问题:

after_create_commit { CreateS3BucketWorker.perform_async(id) }

我的所有逻辑都已经提取到 sidekiq worker 中,所以创建一个命名函数只是为了调用 worker 似乎过度了。传入一个块让我打电话给工人并将我的回调保持在 1 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多