5

我正在创建我的第一个 Rails 3 引擎,目前收到以下错误消息

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

为了给你更多的背景知识,我没有把引擎作为一个 gem,但是我把引擎文件放在了 vendor/plugins 文件夹中。我知道在插件文件夹中加载时存在问题,但我不清楚如何解决该问题。

我在 Engine 中的 rails/init.rb 文件有以下代码

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

建议?

4

2 回答 2

2

我想我记得读过 Railties 在插件目录中不起作用,因为它们打算在应用程序启动过程中的不同点加载。我会建议使用像 Jeweler 这样的工具来创建宝石,它可以为您完成很多工作。Railtie/Engine 的目的是拥有一个可重用的组件,可以包含在多个 Rails 应用程序中。创建 gem 后,您可以指向 Gemfile 中的本地 gem 路径。这使您可以在 Rails 应用程序中查看引擎代码的更改,而无需在每次更改引擎代码时都构建和重新安装 gem。当然,您希望将 bundler 指向生产中已安装的 gem。我建议将它放在 github 上,并在生产中的 Gemfile 中使用该 URL。

Bundler 本地 gem 示例:

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

查看 Modern Rubyist 的网站。他有一个关于创建 Railties 和 Engines 的很​​好的系列。自从写这篇文章以来,Rails 可能已经发生了一些变化,但我认为其中大部分仍然是相关的。当我学习如何使用 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/

于 2010-09-19T20:37:09.743 回答
2

约翰,我相信引擎(通常是 gem)与插件(存在于供应商中)在 rails 初始化过程中的不同点加载。

引擎实际上有更多的灵活性,它们可以更深地钩入轨道。此外,打包为 gem 有很多优点:更容易在应用程序之间共享,更容易在单独的代码仓库中维护,更容易版本控制。

我现在正在创建我的第一个 Rails 引擎,并创建了一个有用的起点和入门指南:

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

于 2010-10-06T22:30:13.597 回答