class RuboCop::Cop::Rails::IgnoredSkipActionFilterOption
end
if: -> { trusted_origin? && action_name != “admin” }
skip_before_action :login_required,
class MyPageController < ApplicationController
# good
end
except: :admin, if: :trusted_origin?
skip_before_action :login_required,
class MyPageController < ApplicationController
# bad
@example
end
if: -> { trusted_origin? && action_name == “show” }
skip_before_action :login_required,
class MyPageController < ApplicationController
# good
end
only: :show, if: :trusted_origin?
skip_before_action :login_required,
class MyPageController < ApplicationController
# bad
@example
are used together.
Similarly, the ‘except` option will be ignored when `if` and `except`
The `if` option will be ignored when `if` and `only` are used together.
as options of `skip_*` action filter.
Checks that `if` and `only` (or `except`) are not used together
def if_and_except?(options)
def if_and_except?(options) options.key?(:if) && options.key?(:except) end
def if_and_only?(options)
def if_and_only?(options) options.key?(:if) && options.key?(:only) end
def on_send(node)
def on_send(node) options = filter_options(node) return unless options return unless options.hash_type? options = options_hash(options) if if_and_only?(options) add_offense(options[:if], message: format(MSG, prefer: :only, ignore: :if)) do |corrector| remove_node_with_left_space_and_comma(corrector, options[:if]) end elsif if_and_except?(options) add_offense(options[:except], message: format(MSG, prefer: :if, ignore: :except)) do |corrector| remove_node_with_left_space_and_comma(corrector, options[:except]) end end end
def options_hash(options)
def options_hash(options) options.pairs .select { |pair| pair.key.sym_type? } .to_h { |pair| [pair.key.value, pair] } end
def remove_node_with_left_space_and_comma(corrector, node)
def remove_node_with_left_space_and_comma(corrector, node) corrector.remove( range_with_surrounding_comma( range_with_surrounding_space( node.source_range, side: :left ), :left ) ) end