Ruby on rails 如果创建/更新/销毁操作在没有回调的情况下成功,请执行一些代码

Ruby on rails 如果创建/更新/销毁操作在没有回调的情况下成功,请执行一些代码,ruby-on-rails,activeadmin,Ruby On Rails,Activeadmin,现在我有一个模型Trip,它保存后会运行一些回调。我想隔离此行为,以便它仅在控制器上运行时发生(创建/更新/销毁),因此我想删除回调 假设我有一个服务对象DoSomething 35; call,它接受trip并执行我需要的所有操作,那么在create/update/destroy中运行它的选项是什么 我有一些想法,但其中涉及恐怖的事情,如: def create super() do |success, failure| @action_successful = failure.i

现在我有一个模型
Trip
,它保存后会运行一些回调。我想隔离此行为,以便它仅在控制器上运行时发生(创建/更新/销毁),因此我想删除回调

假设我有一个服务对象
DoSomething 35; call
,它接受
trip
并执行我需要的所有操作,那么在
create/update/destroy
中运行它的选项是什么

我有一些想法,但其中涉及恐怖的事情,如:

def create
  super() do |success, failure|
    @action_successful = failure.instance_of?(
      InheritedResources::BlankSlate
    ) || failure.class.nil?
    if @action_successful
      DoSomething.call(Trip.find(params[:id]))
    end
  end
end
这有很多缺点:

  • 检测操作是否成功的可怕方法
  • 无法获取对正在操作的对象的内存中引用(从db重新加载)
  • 因为我没有对内存中对象的引用,所以在销毁期间运行某些东西是很有问题的(没有引用,无法重新加载)
按要求添加代码 定制服务(我有多个)

和activeadmin文件

ActiveAdmin.register Trip do
  controller do
    def update
      if super() # This is pseudocode, I want to run this branch only if save is successful
        SaveLastChangedTrip.call(current_user, resource)
      end
    end
  end
end

我想你正在寻找这样的东西:

    def create
      create! do |success, failure|
        success.html do
          DoSomething.call(resource)
        end
      end
    end

类似的例子请参见。

您好,您考虑过使用观察者模式吗?您好@Bohdan,观察者模式很合适,但我无法访问对象的内存副本,这是我所不知道的,因此使用观察者模式“观察”对象会有点复杂。您可以添加更多代码吗?“这个问题看起来很复杂,更多的信息肯定会有帮助的,”补充了一个我试图实现的例子!嘿,我不熟悉ActiveAdmin,但从我读到的内容来看,您可以使用
@trip=trip.find(params[:id])
访问对象,您也可以尝试插入
调试器/绑定。撬动
查看您拥有的数据是的,谢谢,我得到了类似的结果。虽然我真的不喜欢
success.html
,但看起来这是唯一的办法。
ActiveAdmin.register Trip do
  controller do
    def update
      if super() # This is pseudocode, I want to run this branch only if save is successful
        SaveLastChangedTrip.call(current_user, resource)
      end
    end
  end
end
    def create
      create! do |success, failure|
        success.html do
          DoSomething.call(resource)
        end
      end
    end