web-dev-qa-db-fra.com

Rails: chargement d'une classe personnalisée à partir du dossier lib dans le contrôleur

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

11
nao

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.

18
spickermann

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.

3
Sebastian Palma

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 
1