Почему полицейский Rubocop по Rails/FilePath рекомендует Rails.root.join

У меня есть следующая строка в моем коде:

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

Полицейский Rails/FilePath из Rubocop рекомендует изменить его на:

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

Почему? Первый более компактен, появляется быстрее и, возможно, более удобочитаем.


person CodeSmith    schedule 29.12.2017    source источник
comment
Rails.root.join фактически генерирует косую черту в окнах или более обобщенно: File.join не зависит от платформы, где находится строка с косой чертой.   -  person spickermann    schedule 29.12.2017
comment
Разделитель пути зависит от платформы. AFAIK Windows будет принимать / большую часть времени, но она действительно хочет видеть обратную косую черту (которую я не могу пройти мимо Markdown). Предположительно Rails.root.join будет использовать правильный разделитель. Не уверен насчет Rubocop, и я не прикасался к Windows уже несколько десятилетий, так что просто комментарий.   -  person mu is too short    schedule 29.12.2017
comment
Этот вопрос устарел, по умолчанию используется полный путь: github .com/rubocop-hq/rubocop-rails/issues/195   -  person moger777    schedule 05.07.2020


Ответы (4)


Как уже упоминалось, RuboCop рекомендует делать это, чтобы избежать проблем с операционными системами, которые не используют / в качестве разделителя пути. Команда RuboCop добавила некоторые пояснения после того, как был задан этот вопрос (как показано на https://github.com/bbatsov/rubocop/pull/5571/files).

При этом я не уверен, что этот полицейский нужен. Из других потоков SO, таких как косая черта и обратная косая черта в Ruby, похоже, что Ruby делает хорошая работа по автоматическому преобразованию путей за кулисами (когда код выполняется в Ruby). В тех случаях, когда пути передаются внешним системам, люди, вероятно, будут очень специфичны в отношении структуры пути.

person CodeSmith    schedule 03.03.2018

Из руководства Rubocop.

Этот коп используется для идентификации использования процесса объединения путей к файлам для использования предложения Rails.root.join. Это делается для того, чтобы избежать ошибок в операционной системе, которые не используют '/' в качестве разделителя пути.

person Axe    schedule 01.03.2018

Я думаю, что это просто подход «давайте выберем стиль». Я не вижу никакого значимого обсуждения, когда идея была предложена.

person Mickey Sheu    schedule 29.12.2017

Это настройки по умолчанию. Подробнее об опциях можно прочитать здесь

Вы можете изменить его с помощью файла .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
person user3309314    schedule 29.12.2017
comment
Я ищу причину, ПОЧЕМУ rubocop выбрал это по умолчанию. - person CodeSmith; 29.12.2017
comment
Возможно, некоторые люди (например, создатели Rubocop) предпочитают этот стиль, возможно вариант по умолчанию проще для использования переменных в пути, потому что он может помочь избежать интерполяции строк. - person user3309314; 29.12.2017