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

Mat*_*ira 21 ruby ruby-on-rails ruby-on-rails-plugins ruby-on-rails-3

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

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


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

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

Aar*_*nni 9

这里有太多问题可以正确回答这些问题.这是通过挖掘和尝试来为您带来回报的其中一项.随着您的深入了解,请回过头来询问新的具体问题.

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

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

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

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

gem 'my-forum', :path => '~/work/my-forum'
Run Code Online (Sandbox Code Playgroud)

命名空间

您至少应该命名您的表/模型,这样就不会遇到命名冲突.看看你当前的论坛应用程序,我至少在你的所有表格前加上'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
Run Code Online (Sandbox Code Playgroud)