Rails Chemin du répertoire racine?

307

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

fivetwentysix
la source

Réponses:

545

Dans Rails 3 et plus récent:

Rails.root

qui renvoie un Pathnameobjet. Si vous voulez une chaîne, vous devez ajouter .to_s. Si vous voulez un autre chemin dans votre application Rails, vous pouvez utiliser joincomme ceci:

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

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

Mischa
la source
2
Dans Rails 2.3 Rails.root est une instance de Pathname où RAILS_ROOT est une chaîne.
Richard
1
Seul Rails.root en 3.1 et versions ultérieures (ahh .. le cas du changement de CONSTANT;))
thanikkal
2
Vous pouvez aussi Rails.root.join(*%w( app assets images logo.png )).
Nate
12
Personnellement, j'aime la nouvelle syntaxe:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32
105

Pour une super justesse, vous devez utiliser:

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

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

malclocke
la source
1
Par exemple, sur mon MacBook, Rails.root.join('foo','bar')évalue l'objet Pathname dont le @path est '/ Users / purplejacket / my_rails_app / foo / bar'
Purplejacket
21

Vous pouvez accéder au chemin de l'application rails à l'aide d'une variable RAILS_ROOT.

Par exemple:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
Anubhaw
la source
2
RAILS_ROOT est déprécié depuis que Rails 3.0 a utilisé Rails.root
vidur punj
15

En plus de toutes les autres bonnes réponses, puisqu'il Rails.roots'agit d'un Pathnameobjet, cela ne fonctionnera pas:

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

Vous pourriez 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
Andrew
la source
1
En fait, Rails.root + 'app/assets' ça marche, mais oui, joinc'est plus propre.
Mischa
1
Ce n'est généralement pas une bonne idée de coder en dur ce qu'est le jeton de séparation de fichiers (\ ou /).
Alexander Bird
5

Dans certains cas, vous souhaiterez peut-être la racine Rails sans avoir à charger Rails.

Par exemple, vous obtenez un cycle de rétroaction plus rapide lorsque les modèles TDD qui ne dépendent pas de Rails nécessitent spec_helperau 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 des objets Ruby Old Plain à partir de leurs fichiers de spécifications.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...
Dennis
la source
0

Vous pouvez utiliser:

Rails.root

Mais pour rejoindre les actifs, vous pouvez utiliser:

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

J'espère que cela vous aidera.

Ali Hassan Mirza
la source
-2

Simplement par Rails.root ou si vous voulez ajouter quelque chose, nous pouvons l'utiliser comme Rails.root.join ('app', 'assets'). To_s

Amit
la source
Veuillez supprimer cette réponse, c'est juste du bruit, n'ajoute rien à la question.
luk2302
-5

Simplement en écrivant Rails.root et en ajoutant n'importe quoi par Rails.root.join (*% w (actifs de l'application)). To_s

sumit
la source
1
Veuillez supprimer cette réponse, c'est juste du bruit, n'ajoute rien à la question et elle est mal formatée.
luk2302