web-dev-qa-db-fra.com

Rails chemin du répertoire racine?

Comment obtenir le chemin du répertoire racine de mon application Rails?

296
fivetwentysix

Dans Rails 3 et plus récent:

Rails.root

qui retourne un objet Pathname . Si vous voulez une chaîne, vous devez ajouter .to_s. Si vous voulez un autre chemin dans votre application Rails, vous pouvez utiliser join comme ceci:

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

Dans Rails 2, vous pouvez utiliser la constante Rails_ROOT, qui est une chaîne.

528
Mischa

Pour une exactitude parfaite, vous devriez utiliser:

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

ce qui permettra à votre application de fonctionner sur des plates-formes où / n'est pas le séparateur de répertoires, si quelqu'un essaye de l'exécuter sur un seul.

103
malclocke

Vous pouvez accéder au chemin de l'application Rails à l'aide de la variable Rails_ROOT.

Par exemple:

render :file => "#{Rails_ROOT}/public/layouts/mylayout.html.erb"
21
Anubhaw

En plus de toutes les autres réponses correctes, puisque Rails.root est un objet Pathname , cela ne fonctionnera pas:

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

Vous pouvez utiliser quelque chose comme join

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

Si vous voulez une chaîne, utilisez ceci:

Rails.root.join('app', 'assets').to_s
15
Andrew

Dans certains cas, vous souhaiterez peut-être utiliser la racine Rails sans devoir charger de Rails.

Par exemple, vous obtenez un cycle de retour plus rapide lorsque vous modifiez des modèles qui ne dépendent pas de Rails en exigeant spec_helper au lieu de 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

Ce qui vous permet de charger facilement Plain Old Ruby Objects à partir de leurs fichiers de spécifications.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...
4
Dennis

Vous pouvez utiliser:

Rails.root

Mais pour rejoindre les actifs, vous pouvez utiliser:

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

Espérons que cela vous aide.

0
Ali Hassan Mirza