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.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