diff --git a/changelog/fix_fix_railscompactblank_bug_when_offense.md b/changelog/fix_fix_railscompactblank_bug_when_offense.md new file mode 100644 index 0000000000..057e02e152 --- /dev/null +++ b/changelog/fix_fix_railscompactblank_bug_when_offense.md @@ -0,0 +1 @@ +* [#753](https://github.com/rubocop/rubocop-rails/pull/753): Fix `Rails/CompactBlank` bug when offense is found in block. ([@r7kamura][]) diff --git a/lib/rubocop/cop/rails/compact_blank.rb b/lib/rubocop/cop/rails/compact_blank.rb index 8efcf30f1d..fe5e88448f 100644 --- a/lib/rubocop/cop/rails/compact_blank.rb +++ b/lib/rubocop/cop/rails/compact_blank.rb @@ -93,7 +93,11 @@ def use_hash_value_block_argument?(arguments, receiver_in_block) end def offense_range(node) - end_pos = node.parent&.block_type? ? node.parent.loc.expression.end_pos : node.loc.expression.end_pos + end_pos = if node.parent&.block_type? && node.parent&.send_node == node + node.parent.loc.expression.end_pos + else + node.loc.expression.end_pos + end range_between(node.loc.selector.begin_pos, end_pos) end diff --git a/spec/rubocop/cop/rails/compact_blank_spec.rb b/spec/rubocop/cop/rails/compact_blank_spec.rb index 059bf81d5a..a1f459c892 100644 --- a/spec/rubocop/cop/rails/compact_blank_spec.rb +++ b/spec/rubocop/cop/rails/compact_blank_spec.rb @@ -68,6 +68,17 @@ RUBY end + it 'registers and corrects an offense when using `reject(&:blank?)` in block' do + expect_offense(<<~RUBY) + hash.transform_values { |value| value.reject(&:blank?) } + ^^^^^^^^^^^^^^^^ Use `compact_blank` instead. + RUBY + + expect_correction(<<~RUBY) + hash.transform_values { |value| value.compact_blank } + RUBY + end + it 'does not register an offense when using `compact_blank`' do expect_no_offenses(<<~RUBY) collection.compact_blank