トランザクションの中で遷移処理を書いてしまうと何か具体的な問題は発生しますか?
Railsに限らず、WebのMVCなら書き間違えてしまいかねないのですが、
本来の形
本来下記のようにすべきところを
def hoge
ActiveRecord::Base.transaction do
....
....
raise ActiveRecord::RecordNotDestroyed unless Foo.destroy_all
end
redirect_to .....
rescue ActiveRecord::RecordNotDestroyed
redirect_to .....
end
誤り
遷移処理をトランザクションの中に入れてしまった場合に具体的な問題は起こりますでしょうか?
def hoge
ActiveRecord::Base.transaction do
....
....
raise ActiveRecord::RecordNotDestroyed unless Foo.destroy_all
redirect_to ..... # <- トランザクション中に書いてしまった!
end
rescue ActiveRecord::RecordNotDestroyed
redirect_to .....
end
説明
raise
で例外が起こった場合はどちらも rescue
に処理が飛ぶので、例外が起こったとしても処理の流れに違いはないように思います。(とはいえ、DBに関するブロックに遷移処理が入っているので、ロジック的にもソースコードの美しさ的にも変だとは思いますが)