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