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


Ответы:


545

В 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;))
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')

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


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"

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


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

-5

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


1
Пожалуйста, удалите этот ответ, это просто шум, ничего не добавляет к вопросу и он плохо отформатирован.
luk2302
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.