class RuboCop::Cop::Rails::EagerEvaluationLogMessage

This cop 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.

@example

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

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

Constants

MSG
RESTRICT_ON_SEND

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/rails/eager_evaluation_log_message.rb, line 40
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

Private Instance Methods

replacement_range(node) click to toggle source
# File lib/rubocop/cop/rails/eager_evaluation_log_message.rb, line 57
def replacement_range(node)
  stop = node.loc.expression.end
  start = node.loc.selector.end

  if node.parenthesized_call?
    stop.with(begin_pos: start.begin_pos)
  else
    stop.with(begin_pos: start.begin_pos + 1)
  end
end
replacement_source(node, arguments) click to toggle source
# File lib/rubocop/cop/rails/eager_evaluation_log_message.rb, line 68
def replacement_source(node, arguments)
  if node.parenthesized_call?
    " { #{arguments.source} }"
  else
    "{ #{arguments.source} }"
  end
end