我制作了很多rails应用程序,似乎有很多方法可以重复使用代码。
我重复使用的内容如下:
css文件, 初始化, views / shared / partials 管理员图片 申请助手 haml视图模板 宝石 等...
我曾经试图在一年前把所有这些都放到一个宝石中,但它主要是因为改变了依赖关系,而且事实上我一直在调整代码并添加它。这不是一个好的宝石,因为要看到一个简单的变化,你必须编译/发布/安装宝石。所以宝石是不对的。
建议的方法是保持所有这些“个人”代码或多或少模块化,以便我可以将其“填充”到新的rails项目中,并将其编辑为普通的rails代码(无宝石编译/发布)。
我想到的两个词是引擎和插件,但我真的不太了解它们中的任何一个是如何工作的。我也听说过(令人困惑的)“模板”,而不是视图类型。
你有什么建议。我很想知道这个问题!
答案 0 :(得分:3)
您正在使用模板+引擎进行思考。
模板非常适合一次性使用。它们允许您生成符合特定的模板的应用程序,这为您构建基础提供了良好的基础。您可以在this wonderful guide中找到有关模板的更多信息。
我认为发动机是两者中最好的。它们允许您提供与模板相同的基础,但还允许您在该基础上进行扩展以便以后使用。在引擎中,您可以拥有所需的所有内容。您可以通过运行以下命令生成其中一个神奇的创作:
rails plugin new pixelearth_base --mountable
这将生成引擎的基础,然后您可以拥有所需的所有内容。
让我告诉你方法。
CSS文件/图片
CSS文件进入app/assets
,就像在Rails 3.1应用程序中一样,然后以相同的方式处理。您可以在Asset Pipeline guide中详细了解它们。如果它们在您的应用程序中,您可以完全引用它们。当然,您的应用程序中与引擎内部名称相同的任何资产都将优先。
<强>初始值设定强>
这些进入config/initializers
,就像应用程序一样(提示:这是一个带引擎的运行主题)。它们以相同的方式工作,并在this section of the Configuring Guide中进行了解释,尽管我认为你已经知道了很多。
共享观点
这些会在您的引擎中进入app/views/shared
。应用程序中名为sameically的任何文件都将优先于引擎中的文件。应用程序将能够无缝访问此目录中的任何文件,因为引擎已将其视图路径添加到应用程序中。
<强>局部模板强>
同上。
管理强>
您为此尝试了精彩的rails_admin引擎吗?也许这适合你。如果没有,您可以像在应用程序中一样将此功能构建到引擎中。
<强>助手强>
与其他一切工作方式大致相同。将它们添加到您的引擎中,您将会很高兴。虽然我对最后一点没有信心,但您可能必须在控制器的顶部进行helper SomeHelper
才能将它们包括在内。
<强> Haml的强>
使用如下所示的行将此指定为引擎pixelearth_base.gemspec
文件中引擎的依赖项:
s.add_dependency 'haml', '3.1.3'
您的引擎(以及扩展名,您的应用程序)将能够在视图中使用haml。
<强>模板强>
我不确定你的意思,所以我要掩饰它。
<强>宝石强>
共享gem依赖项应该在pixelearth_base.gemspec
中指定,就像haml示例一样。
包括引擎
现在,您需要将此引擎包含在您的应用程序中,但您不想经历一直更新gem的痛苦。我认为最好的方法是将gem推送到GitHub,然后在你的应用程序Gemfile
中指定这样的一行:
gem 'pixelearth_base', :git => "git://github.com/pixelearth/pixelearth_base"
每当您更新此gem并将新更改推送到GitHub时,您将需要运行bundle update pixelearth_base
以使用最新版本更新您的应用程序。每次运行bundle update
时,它都将锁定到该特定版本。在您再次运行bundle update ...
之前,不会确认对引擎的任何进一步更改。
安装引擎
您在IRC中询问的最后一件事是安装。如果您碰巧在引擎中使用共享功能(即控制器等),那么您需要在应用程序中安装引擎。这非常简单,可以通过将此行添加到config/routes.rb
:
mount PixelEarth::Engine, :at => "pixelearth"
PixelEarth::Engine
类在引擎lib/pixel_earth/engine.rb
中定义,并通过继承Rails::Engine
提供所需的所有功能。您的应用程序中的任何功能现在都可以在您的应用程序的/pixelearth
处获得。
答案 1 :(得分:1)
这取决于文件,如果你想我可以为你打破答案。但我的一般建议是保持代码小巧轻便,专为一项任务而设计。这样做的一个好方法是确定您编写的代码是orthogonal。维基百科将其定义为计算机科学范围:
正交性是一种促进可行性的系统设计属性 复杂设计的紧凑性。正交性保证了这一点 修改系统组件产生的技术效果 既不创造也不传播副作用到其他组成部分 系统。由组件组成的系统的紧急行为 应严格按照其逻辑和形式的正式定义进行控制 不是由于整合不良造成的副作用,即 模块和接口的非正交设计。正交性降低 测试和开发时间,因为它更容易验证设计 既不会引起副作用也不会依赖它们。
就限制代码的大小而言,您可以根据自己的个人判断来决定何时何地委派方法和类。但是,我想在将我面临的问题分解为较小的部分时牢记separation of concerns和single responsibility principle。
但是,你不能只编写好的代码并保留它,你需要有一个很好的方法来分发你的代码。我的LAN上有一个开发服务器,它托管了许多私有Git存储库,但是您可以使用任何VCS或DVCS来保持代码的有序性。然后,当我需要更新它们并进行更改时,我可以使用它来保持我的项目从服务器获取最新版本的文件。如果我的工作项目的需求发生变化,我总是可以分支。使用Git我总是在版本控制中使用我的代码,所以我使用submodules让我保持最新版本的代码方便和最新。
如果您需要更多信息或者如果您不使用Git,请告诉我,我可以在您熟悉的VCS上查找类似的功能。另外我还想指出,这是一个很好的问题,有很多要点,我很高兴你问过,因为我记得在努力解决这个问题,我相信其他人也在解决同样的问题。
答案 2 :(得分:0)
当我为我的应用程序编写sw时,我觉得可以在其他项目中重复使用,我将其编写为自己的插件。
我从我正在使用的其中一个插件中复制插件目录模型。