J'ai créé un fichier sous lib/services/my_service.rb.
# /lib/services/my_service.rb
class MyService
...
end
Je veux l'utiliser dans app/controllers/my_controller
class MyController < ApplicationController
def method
service = MyService.new()
end
Je reçois une erreur indiquant que MyService est une constante non initialisée. J'ai essayé de l'importer avec
require '/lib/services/my_service.rb'
Mais je reçois
cannot load such file -- /lib/services/my_service.rb
Edit: J'ai essayé le chargement automatique depuis application.rb en utilisant
config.autoload_paths << Rails.root.join('lib')
Mais pas de dés. Obtient toujours la constante non initialisée MyController :: MyService
Ruby on Rails s'attend à ce que certaines conventions de dénomination prennent en charge le chargement automatique.
Rails peut charger automatiquement un fichier situé dans lib/services/my_service.rb
si la structure du modèle/classe était Services::MyService
.
Change ton lib/services/my_service.rb
à:
module Services
class MyService
# ...
end
end
Et utilisez cette classe comme ceci dans votre contrôleur:
service = Services::MyService.new
Veuillez noter qu'en fonction de votre Ruby on Rails version vous devrez peut-être ajouter le dossier lib
à la liste des dossiers qui sont interrogés lorsque recherche d'un fichier à charger automatiquement:
# add this line to your config/application.rb:
config.autoload_paths << "#{Rails.root}/lib"
En savoir plus sur chargement automatique dans les guides Rails.
Vous devez probablement activer le chargement automatique à partir des fichiers dans le lib/
dossier:
# config/application.rb
config.autoload_paths << "#{Rails.root}/lib"
Si vous préférez le faire "manuellement", vous ne pouvez exiger ce fichier que dans le même fichier:
# config/application.rb
require './lib/my_service'
Après cela, un redémarrage est nécessaire.
il y a un paramètre dans config/application.rb dans lequel vous pouvez spécifier les répertoires qui contiennent les fichiers que vous souhaitez charger automatiquement.
Depuis application.rb:
# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
ou
config.autoload_paths += Dir["#{config.root}/lib/**/"]
Rails 3
Dir["lib/**/*.rb"].each do |path|
require_dependency path
end