class RuboCop::Cop::Rails::FilePath

Rails.root.join(‘app’, ‘models’, ‘goober’)
# good
“#{Rails.root}/app/models/goober”
File.join(Rails.root, ‘app/models/goober’)
Rails.root.join(‘app/models/goober’)
# bad
@example
to use ‘Rails.root.join` clause.
This cop is used to identify usages of file path joining process

def check_for_file_join_with_rails_root(node)

def check_for_file_join_with_rails_root(node)
  return unless file_join_nodes?(node)
  return unless file_join_nodes(node).map(&:method_args)
                                     .flatten
                                     .any? { |e| rails_root_nodes?(e) }
  register_offense(node)
end

def check_for_rails_root_join_with_slash_separated_path(node)

def check_for_rails_root_join_with_slash_separated_path(node)
  return unless rails_root_nodes?(node)
  return unless rails_root_join_nodes(node).map(&:method_args)
                                           .flatten
                                           .any? do |arg|
                                             arg.source =~ %r{/}
                                           end
  register_offense(node)
end

def on_dstr(node)

def on_dstr(node)
  return unless rails_root_nodes?(node)
  register_offense(node)
end

def on_send(node)

def on_send(node)
  check_for_file_join_with_rails_root(node)
  check_for_rails_root_join_with_slash_separated_path(node)
end

def register_offense(node)

def register_offense(node)
  line_range = node.loc.column...node.loc.last_column
  add_offense(
    node,
    source_range(processed_source.buffer, node.loc.line, line_range),
    MSG
  )
end