class RuboCop::Cop::Rails::ActionOrder
def destroy; end
def show; end
def index; end
# good
def show; end
def destroy; end
def index; end
# bad
@example
—-
- destroy
- update
- create
- edit
- new
- show
- index
ExpectedOrder:
Rails/ActionOrder:
—-
[source,yaml]
defined before actions not specified.
All other methods are ignored. So, the actions specified in ‘ExpectedOrder` should be
The cop is configurable and can enforce any ordering of the standard actions.
Enforces consistent ordering of the standard Rails RESTful controller actions.
def actions
def actions @actions ||= Set.new(expected_order) end
def add_range(range1, range2)
def add_range(range1, range2) range1.with( begin_pos: [range1.begin_pos, range2.begin_pos].min, end_pos: [range1.end_pos, range2.end_pos].max ) end
def correction_target(def_node)
def correction_target(def_node) range_with_comments_and_lines(def_node.each_ancestor(:if).first || def_node) end
def expected_order
def expected_order cop_config['ExpectedOrder'].map(&:to_sym) end
def find_index(node)
def find_index(node) expected_order.find_index(node.method_name) end
def on_class(node)
def on_class(node) action_declarations(node, actions).each_cons(2) do |previous, current| next if node_visibility(current) != :public || non_public?(current) next if find_index(current) >= find_index(previous) register_offense(previous, current) end end
def range_with_comments(node)
def range_with_comments(node) ranges = [node, *processed_source.ast_with_comments[node]].map(&:source_range) ranges.reduce do |result, range| add_range(result, range) end end
def range_with_comments_and_lines(node)
def range_with_comments_and_lines(node) range_by_whole_lines(range_with_comments(node), include_final_newline: true) end
def register_offense(previous, current)
def register_offense(previous, current) message = format( MSG, expected_order: expected_order.join(', '), previous: previous.method_name, current: current.method_name ) add_offense(current, message: message) do |corrector| current = correction_target(current) previous = correction_target(previous) swap_range(corrector, current, previous) end end
def swap_range(corrector, range1, range2)
def swap_range(corrector, range1, range2) corrector.insert_before(range2, range1.source) corrector.remove(range1) end