【发布时间】:2015-06-10 22:23:57
【问题描述】:
我喜欢 Ruby On Rails,我每天都在学习和提高我的技能。目前我正在开发一个由多个客户使用的应用程序,我想重构我的代码,这样我就可以对我的代码质量充满信心。
我正在为如何实现异常处理和使用事务而苦恼。我有一个控制器,它必须创建和更新三个对象。为了简化我的情况。
在我的控制器中:
def update
@user.change_value_x #(1) effects Model 'User'
if condition == y
@user.create_coupon #(2) effects Model 'Coupon' via Model 'User'
end
create_a_history_item #(3) effect Model 'History'
end
第一种(1)和第二种方法(2)位于用户模型中,第三种方法(3)也被其他控制器使用,位于/lib目录下的一个模块中。所有方法都在更新/保存/创建数据库项。
如果其中一项操作失败,所有数据库操作都应回滚并提供有关问题的反馈。
我知道“事务”是一个很好的解决方案,并且我在不同的帖子中也表示事务不应该在控制器中使用。
问题:为什么这个?
所以我猜这段代码不是实现事务的正确方法。
def update
ActiveRecord::Base.transaction do
@user.change_value_x #(1) effects Model 'User'
if condition == y
@user.create_coupon #(2) effects Model 'Coupon' via Model 'User'
end
create_a_history_item #(3) effect Model 'History'
end
rescue
#some code that gives feedback to user about the problem
end
处理此问题的最佳/正确方法是什么?
【问题讨论】:
标签: ruby-on-rails ruby transactions controller rescue