Путь к корневому каталогу Rails?

235

Как мне получить путь к корневому каталогу приложения Rails?

Теги:

8 ответов

434
Лучший ответ

В Rails 3 и новее:

Rails.root

который возвращает объект Pathname. Если вам нужна строка, вы должны добавить .to_s. Если вы хотите использовать другой путь в своем приложении Rails, вы можете использовать join следующим образом:

Rails.root.join('app', 'assets', 'images', 'logo.png')

В Rails 2 вы можете использовать константу RAILS_ROOT, которая является строкой.

  • 2
    В Rails 2.3 Rails.root является экземпляром Pathname, где RAILS_ROOT является строкой.
  • 1
    Только Rails.root в 3.1 и позже (ааа .. случай изменения CONSTANT;))
Показать ещё 2 комментария
91

Для правильной правильности вы должны использовать:

Rails.root.join('foo','bar')

который позволит вашему приложению работать на платформах, где / не является разделителем каталогов, должен ли кто-нибудь попробовать и запустить его на одном.

  • 1
    Например, на моем MacBook Rails.root.join('foo','bar') оценивается как объект Pathname, чей @path равен '/ Users / purplejacket / my_rails_app / foo / bar'
20

Вы можете получить доступ к пути к рельсам с помощью переменной RAILS_ROOT.

Например:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
  • 1
    RAILS_ROOT больше не используется, поскольку в Rails 3.0 используется Rails.root
11

В дополнение ко всем другим правильным ответам, поскольку Rails.root является объектом Pathname, это не сработает:

Rails.root + '/app/assets/...'

Вы можете использовать что-то вроде join

Rails.root.join('app', 'assets')

Если вы хотите, чтобы строка использовала это:

Rails.root.join('app', 'assets').to_s
  • 1
    На самом деле Rails.root + 'app/assets' действительно работает, но да, join лучше.
  • 1
    Обычно не стоит жестко задавать код токена разделителя файлов (\ или /).
1

В некоторых случаях вам может понадобиться root Rails без необходимости загрузки Rails.

Например, вы получаете более быстрый цикл обратной связи, когда модели TDD, которые не зависят от Rails, требуя spec_helper вместо rails_helper.

# spec/spec_helper.rb

require 'pathname'

rails_root = Pathname.new('..').expand_path(File.dirname(__FILE__))

[
  rails_root.join('app', 'models'),
  # Add your decorators, services, etc.
].each do |path|
  $LOAD_PATH.unshift path.to_s
end

Это позволяет вам легко загружать объекты Plain Old Ruby из своих файлов спецификаций.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...
0

Вы можете использовать:

Rails.root

Но чтобы присоединиться к активам, вы можете использовать:

Rails.root.join(*%w( app assets))

Надеюсь, это поможет вам.

-2

Просто напишите Rails.root и добавить что-либо Rails.root.join(*% w (активы приложения)). to_s

  • 0
    Пожалуйста, удалите этот ответ, это просто шум, ничего не добавляет к вопросу и он плохо отформатирован.
-2

Просто Rails.root или если вы хотите добавить что-то, мы можем использовать его как Rails.root.join('app', 'assets'). to_s

  • 0
    Пожалуйста, удалите этот ответ, это просто шум, ничего не добавляет к вопросу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню