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.