为什么 rubocop 的 Rails/FilePath 警察推荐 Rails.root.join

Why does rubocop's Rails/FilePath cop recommend Rails.root.join

我的代码中有以下行:

require "#{Rails.root}/config/environments/production.rb"

Rubocop 的 Rails/FilePath 警察建议我将其更改为:

require Rails.root.join('config', 'environments', 'production.rb')

为什么?前者更紧凑,显示速度更快,而且可以说更具可读性。

这是默认设置。您可以阅读更多关于选项 here

您可以使用 .rubocop.yml 文件更改它。这是一个例子,看看文件的结尾。

inherit_from: .rubocop_todo.yml

AllCops:
  DisplayCopNames: true

  Exclude:
    - bin/**/*
    - db/schema.rb
    - node_modules/**/*

  TargetRubyVersion: 2.3

Metrics/LineLength:
  Max: 120

Metrics/MethodLength:
  Exclude:
    - test/**/*

Rails:
  Enabled: true

Rails/FilePath:
  Enabled: false

我认为这只是一种 "let's pick a style" 方法。当这个想法是 proposed 时,我没有看到任何有意义的讨论。

来自Rubocop manual

This cop is used to identify usages of file path joining process to use Rails.root.join clause. This is to avoid bugs on operating system that don't use '/' as the path separator.

正如其他人所提到的,RuboCop 建议这样做以避免不使用 / 作为路径分隔符的操作系统出现问题。在提出这个问题后,RuboCop 团队添加了一些说明(见 https://github.com/bbatsov/rubocop/pull/5571/files)。

话虽这么说,但我不确定是否需要这个警察。从其他 SO 线程,如 slash and backslash in Ruby,听起来 Ruby 在幕后自动转换路径方面做得很好(当代码在 Ruby 中执行时)。在将路径传递到外部系统的情况下,人们可能会对路径结构非常具体。