如何将现有的Rails 3应用程序转换为引擎?

如何将我一直在开发的论坛应用程序转换为Rails引擎,以便它可以嵌入到其他应用程序中?

我应该添加,保留或删除什么? 我应该提供一种集成模型的方法吗? 如何设置路由和用户配置? 如何将其打包成gem? 我应该注意什么?


阅读完文章和文档后,我设法缩小了我的问题范围:

  • 我应该命名模型吗? 也就是说,我应该将它们保存在我的引擎模块和app/models/engine文件夹中吗?
  • 我应该保留配置中的哪些配置文件?
  • 公用文件夹怎么样? 在Rails 3.1中,样式表和javascripts被移动到app/assets文件夹,这解决了这个问题,但是如何在Rails 3.0中实现相同的效果呢?

这里有太多问题无法正确回答。 这是通过挖掘和尝试来为你付出代价的事情之一。 当您深入了解它时,请回过头来询问新的具体问题。

以下是我最近这样做时使用的一些资源。

在大多数情况下,您可以将应用程序目录中的内容保留在原来的位置。 您还应该能够将routes.rb保留在config目录中,但如果您的某些路由与应用程序的路径发生冲突,则可能会出现一些问题。

您可能希望创建一个generator来创建包含引擎所需的所有表的迁移。 可以创建其他生成器来覆盖默认视图等等。

创建一个使用您的gem的测试应用程序。 您将遇到的许多问题都是确保正确加载引擎的依赖关系。 在开发过程中,编辑测试应用程序的Gemfile直接指向gem的源代码……如下所示:

 gem 'my-forum', :path => '~/work/my-forum' 

命名空间

您至少应该命名您的表/模型,这样就不会遇到命名冲突。 看看你当前的论坛应用程序,我至少在你的所有表格前加上’forum_’。 很可能有人使用你的引擎会有一个名为Category的不同模型,例如……所以ForumCategory将是一个更好的选择。

绝对命名您在lib目录中创建的任何类的命名空间。

配置文件

您需要将routes.rb保留在config目录中。 您可能还需要保留初始化器。 任何应用程序特定的东西可能需要移动到其他地方。

公共文件

使用Rails 3.0.x,您可以将样式表和javascripts保存在公共目录中。 我认为有一些代码需要添加到您的Engine类中,但是……

 initializer "static assets" do |app| app.middleware.use ::ActionDispatch::Static, "#{root}/public" end