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

21

我该如何将我正在开发的论坛应用程序转换为Rails Engine,以便可以嵌入到其他应用程序中?

我应该添加、保留还是删除什么?我是否应该提供一种集成模型的方法?我如何设置路由和用户配置?我如何将其打包成一个Gem?我应该注意什么?


阅读文章和文档后,我成功地缩小了问题范围:

  • 我应该对模型进行命名空间处理吗?也就是说,我是否应该将它们保留在我的引擎模块和app/models/engine文件夹中?
  • config中的哪些配置文件应该保留?
  • public文件夹怎么办?在Rails 3.1中,样式表和javascript被移到了app/assets文件夹中,解决了这个问题,但在Rails 3.0中我该如何做到同样的效果?
1个回答

9

这里有太多问题需要逐一回答,但只有深入尝试并实践才能获得回报。当你深入了解时,可以回来提出新的具体问题。

以下是我最近完成此操作时使用的一些资源。

大多数情况下,你可以将应用程序目录中的内容保持原样。你也应该能够将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中,你可以将样式表和javascript放在public目录中。但是,我认为你需要在你的Engine类中添加一些代码...

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

谢谢!在学习和尝试后,我成功地缩小了我的问题列表。然而,有些事情我仍然没有弄清楚。我更新了我的问题,请看一下。 - Matheus Moreira
我已经做了一些补充,但如果你需要更具体的信息,最好在Stack Overflow上开始一个新的问题。 - Aaron Hinni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接