Class: RuboCop::Cop::Rails::TransactionExitStatement
- Inherits:
-
Base
- Object
- Base
- RuboCop::Cop::Rails::TransactionExitStatement
- Defined in:
- lib/rubocop/cop/rails/transaction_exit_statement.rb
Overview
Checks for the use of exit statements (namely return, break and throw) in transactions. This is due to the eventual unexpected behavior when using ActiveRecord >= 7, where transactions exited using these statements are being rollbacked rather than committed (pre ActiveRecord 7 behavior).
As alternatives, it would be more intuitive to explicitly raise an error when rollback is desired, and to use next when commit is desired.
If you are defining custom transaction methods, you can configure it with TransactionMethods.
NOTE: This cop is disabled on Rails >= 7.2 because transactions were restored to their historical behavior. In Rails 7.1, the behavior is controlled with the config active_record.commit_transaction_on_non_local_return.
Constant Summary collapse
- MSG =
'Exit statement `%<statement>s` is not allowed. Use `raise` (rollback) or `next` (commit).'- BUILT_IN_TRANSACTION_METHODS =
i[transaction with_lock].freeze
Instance Method Summary collapse
Instance Method Details
#on_send(node) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/rubocop/cop/rails/transaction_exit_statement.rb', line 82 def on_send(node) return if target_rails_version >= 7.2 return unless in_transaction_block?(node) exit_statements(node.parent.body).each do |statement_node| next if statement_node.break_type? && nested_block?(statement_node) statement = statement(statement_node) = format(MSG, statement: statement) add_offense(statement_node, message: ) end end |