【问题标题】:after_create with multiple methods?after_create 有多种方法?
【发布时间】:2013-01-18 02:29:58
【问题描述】:

我试图在创建后调用两个方法,但将它们放入数组中不起作用...我在 Rails 文档或谷歌中找不到任何内容...有经验的人吗?

after_create [:do_this, :do_that]

没用

【问题讨论】:

  • 我通常不使用数组表示法编写它,并且从来没有遇到过这个问题。也许你可以试试……after_create :do_this, :and_then_this
  • 好吧,我知道它必须简单……但我没有尝试最简单的方法。发布它,我会接受它作为答案。

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord


【解决方案1】:

不需要包围数组中的方法。只需使用:

after_create :do_this, :and_then_this

奖励信息: 如果 before_* 回调返回 false,则所有后续回调和相关操作都将被取消。如果 after_* 回调返回 false,则所有后续回调都将被取消。回调通常按照定义的顺序运行,但定义为模型上的方法的回调除外,这些方法最后调用。

【讨论】:

  • 添加奖励信息:在 Rails 5 中,如果任何 before_callback 返回 false,则回调链不会停止。要显式停止回调链,我们需要使用 throw(:abort)。
  • 你的意思是,如果do_this返回falseand_then_this方法就不会被调用?因为我试过了,它一直在工作。使用导轨5.0.0.1
  • 当 em 像在控制器中一样保持在同一行时,有没有办法向它们发送参数:only: new 那会像after_create :do_this, only: new, :and_then_this
【解决方案2】:

您还可以调用单个方法并在该方法上编排顺序。

after_create :process


def process
  do_this
  do_that
  then_this
end

我个人更喜欢这种方法。没有隐藏的魔法。

【讨论】:

  • 这种方法在“创建后”需要更新数据库记录的多个属性时特别有效。您可以将它们组合成一个update(),而不是让多个方法依次使用update() 写入数据库。
【解决方案3】:

为什么要把这两个回调方法放到一个数组中?

after_create :do_this, :do_that

【讨论】:

    【解决方案4】:

    注意,after_action好像是倒置的。

    
    after_action :do_that_after, :do_that_before
    
    

    当前执行的订单是do_that_before 然后是do_that_after

    编辑:使用 Rails 6.0.3.3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2023-03-17
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多