2010-09-17 19 views
5

Je travaille sur la création de mes premiers Rails 3 moteur et je reçois actuellement le message d'erreur suivantcréer Rails 3 moteur

is a Railtie/Engine and cannot be installed as plugin (RuntimeError) 

Pour vous donner un peu plus de fond, je ne fais pas le moteur comme un bijou, mais j'ai placé les fichiers du moteur dans le dossier fournisseur/plugins. Je sais qu'il y a un problème avec le chargement dans le dossier plugins, mais je ne sais pas comment résoudre le problème.

Mes rails/fichier init.rb dans le moteur a le code suivant

require 'rails' 

module RailsApp 
    module MyEngine 
    class Engine < Rails::Engine 

     config.after_initialize do 
     RailsApp::GameType.register do |game_type| 
      game_type.name = "TreasureIsland" 
      game_type.version = "0.1" 
      game_type.thumbnail = "teasure_island.jpg" 
     end 
     end 
    end 
    end 
end 

Suggestions?

+0

Pourquoi essayez-vous exactement de mettre le moteur dans vendor/plugins? Quelle est la raison de ne pas le développer comme un bijou? Pourquoi ne pas simplement développer comme un bijou? – johnmcaliley

+0

Je pourrais le faire de cette façon. Pas de raison particulière, je ne le faisais pas comme ça, mais je pensais juste que ça devait marcher dans les deux sens? –

Répondre

2

Je pense que je me souviens avoir lu que Railties ne fonctionnerait pas dans le répertoire des plugins, car ils sont destinés à être chargés à un point différent dans le processus de démarrage de l'application. Je recommanderais de créer une gemme en utilisant quelque chose comme un bijoutier, qui fait beaucoup de travail pour vous. Le but de la Railtie/Engine est d'avoir un composant réutilisable qui peut être inclus dans plusieurs applications de rails. Une fois que vous avez créé une gemme, vous pouvez pointer vers le chemin gem local dans votre Gemfile. Cela vous permet de voir les changements dans votre code moteur dans votre application rails sans avoir à construire et réinstaller la gemme chaque fois que vous apportez une modification au code moteur. Bien sûr, vous voulez pointer bundler à la gemme installée en production. Je recommande de le mettre sur github et en utilisant cette URL dans votre Gemfile en production.

exemple gemme locale Bundler:

#Gemfile 
gem "my_engine", :require => "my_engine", :path => "/my_engines/my_engine" 

Consultez le site Web du moderne Rubyist. Il a une bonne série sur la création de Railties and Engines. Il y a peut-être eu des changements à Rails depuis que cela a été écrit, mais je pense que la majeure partie est toujours pertinente. Il m'a aidé un bon peu quand j'ai appris comment écrire moteurs avec Rails 3.

http://www.themodestrubyist.com/2010/03/01/rails-3-plugins---part-1---the-big-picture/
http://www.themodestrubyist.com/2010/03/05/rails-3-plugins---part-2---writing-an-engine/
http://www.themodestrubyist.com/2010/03/16/rails-3-plugins---part-3---rake-tasks-generators-initializers-oh-my/
http://www.themodestrubyist.com/2010/03/22/rails-3-plugins---part-4---more-on-generators/

2

John, je crois que les moteurs (qui sont généralement des pierres précieuses) vs plugins (qui vivent dans le fournisseur) sont chargés à différents points dans le processus d'initialisation des rails.

moteurs ont en fait un peu plus de flexibilité, ils peuvent accrocher plus profondément dans les rails. En outre, l'emballage en tant que gemme présente de nombreux avantages: plus facile à partager entre applications, plus facile à gérer dans un dépôt de code séparé, un contrôle de version plus facile.

Je crée mon premier moteur rails en ce moment et a créé un point de départ utile et rendez-vous à travers pour commencer:

http://keithschacht.com/creating-a-rails-3-engine-plugin-gem/