2012-11-12 4 views
3

J'ai créé un Gem avec des modèles (en fait, extrait du projet principal) pour partager parmi les projets que nous avons dans notre plate-forme.Gemme avec des modèles

Nous avons des dizaines de modèles, donc au lieu d'exiger un par un, j'ai écrit le code suivant:

Gem.find_files("my_gem/models/*.rb").each { |path| require path } 

-je accéder à l'un des projets qui my_gem a dans le fichier des pierres précieuses et en cours d'exécution rails c je reçois la sortie suivante:

/Users/myuser/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.8/lib/active_record/dynamic_matchers.rb:50:in `method_missing': undefined method `has_attached_file' for #<Class:0x007fad4b93ccb8> (NoMethodError) 

Un de mes modèles utilise le paperclip bijou, ce qui est bizarre est:

  1. Si je supprime la ligne déclarée ci-dessus pour charger tous les modèles automatiquement, rails c fonctionne bien
  2. Si je tente d'inclure onlye le modèle qui utilise paperclip require "my_gem/models/paperclip_model" je reçois la même erreur

Alors je change mon gem pour ne charger aucun modèle, et quand j'essaye de référencer n'importe quel modèle de la console rails, il dit que la classe n'est pas chargée, mais alors je cours Gem.find_files("my_gem/models/*.rb").each { |path| require path } ou require "my_gem/models/paperclip_model" 'ils fonctionnent parfaitement et je suis capable de travailler avec le modèle.

L'un de vous a-t-il déjà vu le même problème?

+0

Où dans votre code Rails appelez-vous 'Gem.find_files (" my_gem/models/*. Rb "). Chaque {| path | require le chemin} 'from? –

Répondre

3

Il semble que le changement require pour autoload a résolu le problème

J'ai changé Gem.find_files("my_gem/models/*.rb").each { |path| require path }

pour

Gem.find_files("my_gem/models/*.rb").each do |f| 
    filename = File.basename(f, '.*') 
    class_name_symbol = filename.classify.to_sym 
    autoload class_name_symbol, "my_gem/models/#{filename}" 
end 

et maintenant il est workin g.

+0

je vous remercie de partager cela, m'a beaucoup aidé :) étrange qui exigent ne fonctionne pas si – Richlewis

0

Il semble que l'un des modèles de votre gem dépend de Paperclip, mais vous ne le définissez pas explicitement comme une dépendance. Donc ce qui se passe est que si vos modèles sont chargés avant que trombone soit chargé, vous verrez l'erreur UndefinedMethod pour has_attached_file.

Si vous utilisez vos modèles dans une application Rails qui a paperclip comme une dépendance, et que vous chargez les modèles après la console (ou serveur) a filé jusqu'à, Paperclip sera présent, de sorte que vous ne verrez pas cette Erreur.

La solution est d'ajouter explicitement paperclip comme une dépendance dans votre gemspec, quelque chose comme:

s.add_dependency('paperclip') 

En supposant que ce petit bijou sera toujours utilisé dans le cadre d'une application Rails, cela devrait fonctionner. Sinon, vous peut-être aussi besoin d'ajouter la ligne suivante au-dessus de vos modèles qui utilisent paperclip:

require "paperclip" 
+0

J'ai oublié de mentionner, mais je le fais déjà. –