Rails Chemin du répertoire racine?


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.


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.


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"

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

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 ...

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.


-2

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


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


1
Veuillez supprimer cette réponse, c'est juste du bruit, n'ajoute rien à la question et elle est mal formatée.
luk2302
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.