Ruby on rails 如何调用自定义类方法,当Spree订单完成时!执行的方法

Ruby on rails 如何调用自定义类方法,当Spree订单完成时!执行的方法,ruby-on-rails,spree,Ruby On Rails,Spree,我正在开发spree扩展。我想做的是,在订单完成时创建新的数据库记录。我需要一些建议怎么做。 我如何理解一种方法是在order类中创建自定义方法,并注册新钩子(我应该在哪里注册新钩子?在初始化器中?)。 另一种方法是使用激活器,但我不知道如何订阅事件。我应该把订阅订单事件的代码放在哪里 module Spree class Credit < ActiveRecord::Base def create_new_line(order) #I need call

我正在开发spree扩展。我想做的是,在订单完成时创建新的数据库记录。我需要一些建议怎么做。 我如何理解一种方法是在order类中创建自定义方法,并注册新钩子(我应该在哪里注册新钩子?在初始化器中?)。 另一种方法是使用激活器,但我不知道如何订阅事件。我应该把订阅订单事件的代码放在哪里

module Spree
  class Credit < ActiveRecord::Base
     def create_new_line(order) 
        #I need call this method when order finalized    
     end  
  end
end 

在您的解决方案中,我认为每次更新订单时都会调用钩子。因此,如果您在订单完成后更改了某些内容,那么将再次调用该方法。如果设计上是这样的,Spree建议直接使用状态机回调来做这样的事情,这可能是正确的解决方案。例如:

Spree::Order.class_eval do
  state_machine do
    after_transition :to => :complete, :do => :add_user_credits
  end

  def add_user_credits        
    # do some stuff
  end
end

这样,在订单进入完整状态后,代码将立即执行。

看起来您的解决方案更好。只是我找不到测试它的方法,因为如果我调用order方法finalize!,国家没有改变。我的测试是这样的。当我在浏览器上测试时,当我添加钩子时,状态机解决方案工作。
Spree::Order.class_eval do
  state_machine do
    after_transition :to => :complete, :do => :add_user_credits
  end

  def add_user_credits        
    # do some stuff
  end
end