2010-09-16 9 views

Répondre

467

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.

+2

Dans Rails 2.3 Rails.root est une instance de Pathname où RAILS_ROOT est une chaîne. – Richard

+1

Seulement Rails.root dans 3.1 et plus tard (ahh .. le cas de changer CONSTANT;)) – thanikkal

+1

Vous pouvez également 'Rails.root.join (*% w (app assets images logo.png))'. – Nate

21

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" 
+0

RAILS_ROOT est représenté depuis que Rails 3.0 a été utilisé Rails.root –

96

Pour super correct, vous devez utiliser:

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

qui permettra à votre application fonctionne sur les plateformes où / n'est pas le séparateur de répertoire, si quelqu'un essayer de lancez-le sur un.

+1

Par exemple, sur mon MacBook , 'Rails.root.join ('foo', 'bar')' évalue à Pathname objet dont @path est '/ Users/purplejacket/mon_rails_app/foo/bar' – Purplejacket

12

En plus de toutes les autres réponses, 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 un chaîne utiliser ceci:

Rails.root.join('app', 'assets').to_s 
+1

En fait 'Rails.root + 'app/assets'' * fonctionne *, mais oui "join" est plus propre. – Mischa

+1

Ce n'est généralement pas une bonne idée de coder en dur ce que le jeton de séparateur de fichier est (\ ou /). –

0

Vous pouvez utiliser:

Rails.root 

Mais pour rejoindre les actifs que vous pouvez utiliser:

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

Espérons que cela vous aide.

2

Dans certains cas, vous pouvez avoir besoin de la racine Rails sans devoir charger de 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_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 Objets de leurs fichiers de spécifications.

# spec/models/poro_spec.rb 

require 'spec_helper' 

require 'poro' 

RSpec.describe ... 
-1

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

+0

S'il vous plaît supprimer cette réponse, c'est juste du bruit, n'ajoute rien à la question. – luk2302

-1

simplement en écrivant Rails.root et d'ajouter n'importe quoi par Rails.root.join (*% w (app assets)).to_s

+0

S'il vous plaît supprimer cette réponse, c'est juste du bruit, n'ajoute rien à la question et il est mal formaté. – luk2302

Questions connexes