class RuboCop::Cop::Rails::Presence
a.presence || b
# good
!a.blank? ? a : b
# bad
a.blank? ? b : a
# bad
!a.present? ? b : a
# bad
a.present? ? a : b
# bad
@example
a.presence
# good
!a.blank? ? a : nil
# bad
a.blank? ? nil : a
# bad
!a.present? ? nil : a
# bad
a.present? ? a : nil
# bad
@example
`Object#presence` defined by Active Support.
This cop checks code that can be written more easily using
def build_source_for_or_method(other)
def build_source_for_or_method(other) if other.parenthesized? || other.method?('[]') || !other.arguments? " || #{other.source}" else method = range_between( other.source_range.begin_pos, other.first_argument.source_range.begin_pos - 1 ).source arguments = other.arguments.map(&:source).join(', ') " || #{method}(#{arguments})" end end
def ignore_if_node?(node)
def ignore_if_node?(node) node.elsif? end
def ignore_other_node?(node)
def ignore_other_node?(node) node && (node.if_type? || node.rescue_type? || node.while_type?) end
def message(node, receiver, other)
def message(node, receiver, other) format(MSG, prefer: replacement(receiver, other), current: node.source) end
def on_if(node)
def on_if(node) return if ignore_if_node?(node) redundant_receiver_and_other(node) do |receiver, other| return if ignore_other_node?(other) || receiver.nil? register_offense(node, receiver, other) end redundant_negative_receiver_and_other(node) do |receiver, other| return if ignore_other_node?(other) || receiver.nil? register_offense(node, receiver, other) end end
def register_offense(node, receiver, other)
def register_offense(node, receiver, other) add_offense(node, message: message(node, receiver, other)) do |corrector| corrector.replace(node.source_range, replacement(receiver, other)) end end
def replacement(receiver, other)
def replacement(receiver, other) or_source = if other&.send_type? build_source_for_or_method(other) elsif other.nil? || other.nil_type? '' else " || #{other.source}" end "#{receiver.source}.presence" + or_source end