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

307

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

fivetwentysix
источник

Ответы:

545

В Rails 3 и новее:

Rails.root

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

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

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

Mischa
источник
2
В Rails 2.3 Rails.root является экземпляром Pathname, где RAILS_ROOT является строкой.
Ричард
1
Только Rails.root в версии 3.1 и более поздних (ааа .. случай изменения CONSTANT;))
thanikkal
2
Вы также можете Rails.root.join(*%w( app assets images logo.png )).
конец
12
Лично мне нравится новый синтаксис:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32
105

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

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

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

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

Вы можете получить доступ к пути приложения, используя переменную RAILS_ROOT.

Например:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
Anubhaw
источник
2
RAILS_ROOT больше не используется, поскольку Rails 3.0 использует Rails.root
vidur punj
15

В дополнение ко всем другим правильным ответам, поскольку 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
Обычно не стоит жестко задавать код токена разделителя файлов (\ или /).
Александр Берд
5

В некоторых случаях вы можете захотеть получить корень 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

Что позволяет легко загружать простые старые объекты 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 ('app', 'assets'). To_s

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

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

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