如果create / update / destroy操作成功而没有回调,则执行一些代码

时间:2017-04-25 18:28:34

标签: ruby-on-rails activeadmin

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

假设我有一个服务对象DoSomething#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重新加载)
  • 由于我没有引用内存对象,因此在销毁期间运行某些东西很有问题(没有引用,无法重新加载)

要求的附加代码

class Trip
end

自定义服务(I' ve倍数)

class SaveLastChangedTrip
  def call(user, trip)
    return if user.nil?
    user.update_attributes!(last_trip: trip)
  end
end

和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

1 个答案:

答案 0 :(得分:2)

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

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

有关类似示例,请参阅comments.rb