如何将现有的Rails 3应用程序转换为引擎?
如何将我一直在开发的论坛应用程序转换为Rails引擎,以便它可以嵌入到其他应用程序中?
我应该添加,保留或删除什么? 我应该提供一种集成模型的方法吗? 如何设置路由和用户配置? 如何将其打包成gem? 我应该注意什么?
阅读完文章和文档后,我设法缩小了我的问题范围:
- 我应该命名模型吗? 也就是说,我应该将它们保存在我的引擎模块和
app/models/engine
文件夹中吗? - 我应该保留配置中的哪些配置文件?
- 公用文件夹怎么样? 在Rails 3.1中,样式表和javascripts被移动到
app/assets
文件夹,这解决了这个问题,但是如何在Rails 3.0中实现相同的效果呢?
这里有太多问题无法正确回答。 这是通过挖掘和尝试来为你付出代价的事情之一。 当您深入了解它时,请回过头来询问新的具体问题。
以下是我最近这样做时使用的一些资源。
- 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://pragprog.com/titles/jvrails/crafting-rails-applications
- http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/
在大多数情况下,您可以将应用程序目录中的内容保留在原来的位置。 您还应该能够将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