2014-05-15 2 views
0

J'ai écrit un générateur qui crée le fichier ruby ​​suivant et le dossier:classe joyau local ne se trouve pas dans l'application Rails

app/tests/test.rb 

dans le fichier test.rb J'ai une classe Test qui ressemble à ceci:

class Test < MyCustomModule::MyCustomClass::Base 
... 
end 

maintenant, je veux utiliser sa fonctionnalité dans l'un des fichiers show.html.erb création nouvelle instance comme ceci:

Test.new(...).render(...).html_safe 

mais je reçois l'erreur suivante:

uninitialized constant MyCustomModule::MyCustomClass::Base 

j'utiliser ce qui suit answer pour lier mon petit bijou et mon application rails. Il semble fonctionner comme je suis capable d'utiliser le générateur, mais le module et la classe de gemme ne sont pas vus dans l'application de rails.

Quelqu'un peut-il dire comment résoudre ce problème?


j'essayer de suivre les conseils postés here mais toujours rien changé:

  1. Ajout config.autoload_paths += Dir["#{config.root}/lib/**/"] dans application.rb fichier
  2. J'ai créé ma structure de bijou regardant CarrierWave bijou, de sorte que le nommage des être correct
  3. J'essaie de désactiver config.threadsafe! mais il est déjà désactivé depuis config.cache_classes et config.eager_load sont mis à faux dans le développement

    DEPRECATION WARNING: config.threadsafe! is deprecated. Rails applications behave by default as thread safe in production as long as config.cache_classes and config.eager_load are set to true.

Aussi, regardant adding-asset-to-your-gems documentation rails, il est dit que:

A good example of this is the jquery-rails gem which comes with Rails as the standard JavaScript library gem. This gem contains an engine class which inherits from Rails::Engine. By doing this, Rails is informed that the directory for this gem may contain assets and the app/assets, lib/assets and vendor/assets directories of this engine are added to the search path of Sprockets.

Alors, je l'ai fait cela, et mettre mon fichier de classe modèle dans le dossier assets, mais le résultat est le même.


Les captures d'écran ci-dessous démontrent mon cas réel:

  1. La capture d'écran ci-dessous affiche ma structure de fichier gemme

    enter image description here

  2. Ici vous pouvez voir comment je suis le chargement de la pierre précieuse dans mon application Rails Gemfile:

    gem 'thumbnail_hover_effect', '0.0.3', github: 'thumbnail_hover_effec/thumbnail_hover_effec', branch: 'master' 
    
  3. Je me sers du générateur de bijou un fichier rubis avec un nom de cutstom dans app/thumbnails/test.rb dossier avec le code suivant:

    class Test < ThumbnailHoverEffect::Image::Base 
    ... 
    end 
    

    et d'essayer d'utiliser la classe Test me donne l'erreur uninitialized constant ThumbnailHoverEffect::Image::Base.

  4. Retour dans les fichiers de pierres précieuses, ce sont la façon dont le fichier thumbnail_hover_effect ressemble

    require 'thumbnail_hover_effect/version' 
    require 'thumbnail_hover_effect/engine' 
    require 'thumbnail_hover_effect/image' 
    
    module ThumbnailHoverEffect 
        # Your code goes here... 
    end 
    

    et houe le fichier image ressemble:

    module ThumbnailHoverEffect 
    # 
        class Image 
        ... 
        end 
    end 
    
+0

pouvez-vous fournir du code réel s'il vous plaît? quel est le nom de classe exact, quels sont les noms de fichiers? êtes-vous sûr que tout est chargé correctement (j'en doute). – phoet

+0

@phoet Désolé, pour la relecture tardive. J'ai ajouté du vrai code, laissez-moi savoir si vous avez besoin de savoir quelque chose d'autre. – gotqn

+0

et où 'ThumbnailHoverEffect :: Image :: Base' est censé provenir? – phoet

Répondre

1

De ce que vous avez posté ici, il n'y a pas de ThumbnailHoverEffect::Image::Base défini. Rails autoloading conventions (que vous ne devriez pas être dépendant d'une gem btw, plus sur cela plus tard) serait à la recherche de ce fichier dans thumbnail_hover_effect/image/base.rb, mais la structure du répertoire que vous avez imprimé n'a pas cela. Bien sûr, vous pouvez définir la classe dans thumbnail_hover_effect/image.rb et cela fonctionnera, mais l'extrait abrégé que vous avez posté ne le montre pas. Alors, où est ThumbnailHoverEffect::Image::Base défini?

Si c'est dans thumbnail_hover_effect/image/base.rb alors cela indiquerait que le fichier n'est pas en cours de chargement. Vous pouvez vérifier cela en plaçant un puts 'loading this stupid file' en haut de thumbnail_hover_effect/image/base.rb. Cela vous permettra de diviser le problème en voyant s'il y a un problème avec votre définition de la classe, ou si le problème est de charger les fichiers appropriés. Le débogage consiste à bissecter le problème.

+0

il ne semble même pas qu'il y ait une 'ThumbnailHoverEffect :: Image :: Base' – phoet

+0

Bien sûr, il n'y a pas de' ThumbnailHoverEffect :: Image :: Base' - je n'ai pas défini une telle classe du tout. Je me suis retrouvé dans cette situation stupide parce que je suis ruby ​​newbie qui a décidé d'utiliser une structure de gemme de travail et le code comme un modèle. – gotqn

Questions connexes