web-dev-qa-db-fra.com

Rails Engine - Dépendances Gems, comment les charger dans l'application?

Je fais un moteur ici, ça marche bien en autonome.

Lorsque je le transforme en gemme et le charge dans une autre application, je reçois beaucoup d'erreurs indéfinies, provenant des dépendances de ma gemme de moteur.

Voici le gemspec:

s.add_dependency('Paperclip')
s.add_dependency('jquery-Rails')
s.add_dependency('Rails3-jquery-autocomplete')
s.add_dependency('remotipart')
s.add_dependency('cancan')

Dans l'application, lorsque je fais une installation de bundle, il répertorie toutes ces dépendances, mais lorsque j'exécute l'application, je reçois beaucoup d'erreurs de méthodes non définies (has_attachment de Paperclip par exemple). Il semble que l'application ne charge pas les dépendances des moteurs. Est-ce le comportement par défaut? Puis-je le changer? La même chose s'est produite avec un plugin à l'intérieur du moteur.

Si j'insère à la main ces gemmes, dans l'application Gemfile, tout fonctionne ...

47
Tiago

Incluez-les dans votre gemfile et exécutez l'installation du bundle. Demandez-les ensuite dans votre lib/<your_engine>/engine.rb file. N'oubliez pas d'exiger des rubygèmes

  require 'rubygems'
  require 'Paperclip'
  require 'jquery-Rails'
  require 'Rails3-jquery-autocomplete'
  require 'remotipart'
  require 'cancan'

Ensuite, dans votre application hôte (l'application où vous avez inclus votre gem), exécutez l'installation/la mise à jour du bundle (la mise à jour du bundle a fait l'affaire pour moi), puis tout devrait fonctionner parfaitement. Vous pouvez également tester cela en démarrant la console dans votre application hôte et en tapant simplement le nom du module, par ex.

Loading development environment (Rails 3.0.3)
irb(main):001:0> Paperclip
=> Paperclip

J'espère que cela t'aides

76

Vous pouvez les exiger manuellement comme Daniel l'a publié, et vous pouvez également les exiger automatiquement. Vous devez ajouter des dépendances dans 3 fichiers:

  • yourengine.gemspec

    s.add_dependency "Rails", '4.1.0'
    s.add_dependency "sqlite3"
    
  • Gemfile

    # Imports dependencies from yourengine.gemspec
    gemspec
    
  • lib/yourengine.rb

    # requires all dependencies
    Gem.loaded_specs['yourengine'].dependencies.each do |d|
     require d.name
    end
    
    require 'yourengine/engine'
    
    module Yourengine
    end
    

Mise à jour: c'est une démonstration simpliste de la façon d'exiger les dépendances. Vous devez le tester et filtrer les éléments indésirables, par exemple: exiger d.name sauf si d.type ==: développement (thx @ imsinu9)

23
carlosvini

du Paperclip README :

Pour une utilisation sans Rails:

class ModuleName < ActiveRecord::Base
  include Paperclip::Glue
  ...
end

J'ai eu le même problème et cela l'a résolu pour moi.

2
tali

Vous devez ajouter le fichier gem au fichier .gemspec et à votre fichier engine.rb. Dans le fichier .gemspec, ce serait: s.add_dependency "kaminari", "0.16.1"

Dans le fichier engine.rb en haut, ajoutez: require "kaminari"

Je pense que vous devez également ajouter la gemme au fichier Rails Engine Gemfile and bundle install, mais je ne suis pas certain si vous en avez besoin là-bas).

1
yoyodunno

Vous pouvez inclure toutes les gemmes pour l'environnement avec une simple commande bundler:

Bundler.require(*Rails.groups)

Vous pouvez l'ajouter à un config/initializer.

0
sbonami

Pour le moment (Rails 3.1 et plus je pense), vous ne devriez plus avoir à déclarer de gemmes dans le test/dummy/Gemfile:

Citation de test/factice/Gemfile (généré à l'aide de Rails plugin new my_engine --full):

Déclarez les dépendances de votre gemme dans simple_view_helpers.gemspec. Bundler traitera les dépendances d'exécution comme les dépendances de base et les dépendances de développement seront ajoutées par défaut au groupe de développement:.

Déclarez toutes les dépendances qui sont encore en développement ici plutôt que dans votre gemspec. Ceux-ci peuvent inclure Edge Rails ou des gemmes de votre chemin ou Git. N'oubliez pas de déplacer ces dépendances vers votre gemspec avant de publier votre gem sur rubygems.org.

0
Joshua Muheim

Vous ne devriez vraiment pas en avoir besoin sur le Gemsec, et ils devraient être chargés. Lorsque vous dites "voici la gemme", vous l'entourez de Gem::Specification.new do |s| ou quelque chose dans ce sens, non?

0
chesterbr