Je souhaite inclure la classe suivante de mon dossier de services dans mon contrôleur.

Voici la classe dans ..services / product_service.rb

class MyServices
 class << self
  def screen_print
   "These are the words in screen print"
  end
 end
end

Et tout ce que je veux faire, c'est ceci dans ma manette:

class AmazonsController < ApplicationController
 def index
  @joe = MyServices.screen_print
 end
end

J'ai pensé que je pourrais simplement l'inclure dans le contrôleur. Et ce n'est pas un module, donc inclure ne fonctionne pas, et j'ai essayé de mettre à jour mon fichier config / appliaction.rb et cela n'a pas fonctionné non plus.

0
ToddT 23 déc. 2015 à 18:20

3 réponses

Meilleure réponse

Le nom de votre classe doit être le même que le nom de votre fichier, je crois. Donc, puisque votre fichier est nommé product_service.rb, votre classe doit être:

class ProductService
  class << self
    def screen_print
      "These are the words in screen print"
    end
  end
end

Et dans votre contrôleur:

class AmazonsController < ApplicationController
  def index
    @joe = ProductService.screen_print
  end
end
2
Danny Y 23 déc. 2015 à 15:25

Outre les problèmes de dénomination déjà signalés, Rails ne nécessitera pas automatiquement de fichiers arbitraires provenant de dossiers dont il ne connaît pas l'existence. .

Si vous souhaitez que les fichiers d'un nouveau dossier soient automatiquement requis, vous devez l'ajouter aux chemins de chargement automatique de Rails:

# config/application.rb
config.autoload_paths << Rails.root.join('services')

Voir Chargement automatique des fichiers lib dans Rails 4 pour plus de détails.

1
Community 23 mai 2017 à 12:23

Rails ne charge pas les fichiers à partir d'emplacements inhabituels. Vous devrez indiquer à Rails que le dossier services existe et en charger le fichier.

Ajoutez ce qui suit à votre config/application.rb:

# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += [Rails.root.join('app', 'services')]
0
spickermann 23 déc. 2015 à 15:28