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

时间:2017-12-29 18:26:39

标签: ruby rubocop

我的代码中有以下行:

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

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

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

为什么呢?前者更紧凑,看起来更快,可以说更具可读性。

4 个答案:

答案 0 :(得分:3)

来自Rubocop manual

  

此cop用于标识文件路径连接过程的用法以使用Rails.root.join子句。这是为了避免不使用' /'的操作系统上的错误。作为路径分隔符。

答案 1 :(得分:2)

我认为这只是一个"让我们选择一种风格"做法。当这个想法是proposed时,我没有看到任何有意义的讨论。

答案 2 :(得分:1)

这是默认设置。您可以阅读有关选项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

答案 3 :(得分:0)

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

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