Class: RuboCop::Cop::Rails::EagerEvaluationLogMessage

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/rails/eager_evaluation_log_message.rb

Overview

Checks that blocks are used for interpolated strings passed to Rails.logger.debug.

By default, Rails production environments use the :info log level. At the :info log level, Rails.logger.debug statements do not result in log output. However, Ruby must eagerly evaluate interpolated string arguments passed as method arguments. Passing a block to Rails.logger.debug prevents costly evaluation of interpolated strings when no output would be produced anyway.

Examples:

# bad
Rails.logger.debug "The time is #{Time.zone.now}."

# good
Rails.logger.debug { "The time is #{Time.zone.now}." }

Constant Summary collapse

MSG =
'Pass a block to `Rails.logger.debug`.'
RESTRICT_ON_SEND =
%i[debug].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.autocorrect_incompatible_withObject



40
41
42
# File 'lib/rubocop/cop/rails/eager_evaluation_log_message.rb', line 40

def self.autocorrect_incompatible_with
  [Style::MethodCallWithArgsParentheses]
end

Instance Method Details

#on_send(node) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/rubocop/cop/rails/eager_evaluation_log_message.rb', line 44

def on_send(node)
  return if node.parent&.block_type?

  interpolated_string_passed_to_debug(node) do |arguments|
    message = format(MSG)

    range = replacement_range(node)
    replacement = replacement_source(node, arguments)

    add_offense(range, message: message) do |corrector|
      corrector.replace(range, replacement)
    end
  end
end