Шлях до каталогу директорій 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акуратніше.
Mischa

1
Зазвичай це не гарна ідея жорсткого коду, що це маркер розділювача файлів (\ або /).
Олександр Птах

5

У деяких випадках вам може знадобитися корінь Rails, не завантажуючи Rails.

Наприклад, ви отримуєте швидший цикл зворотного зв'язку, коли моделі TDD'ing, які не залежать від 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 ("додаток", "активи"). 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.