现在我有一个模型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
这有很多缺点:
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
答案 0 :(得分:2)
我认为你正在寻找这样的东西:
def create
create! do |success, failure|
success.html do
DoSomething.call(resource)
end
end
end
有关类似示例,请参阅comments.rb。