最合适的形式,使可重用的Ruby on Rails代码更可重用?

时间:2011-10-02 02:27:20

标签: ruby-on-rails plugins modularity

我制作了很多rails应用程序,似乎有很多方法可以重复使用代码。

我重复使用的内容如下:

css文件, 初始化, views / shared / partials 管理员图片 申请助手 haml视图模板 宝石 等...

我曾经试图在一年前把所有这些都放到一个宝石中,但它主要是因为改变了依赖关系,而且事实上我一直在调整代码并添加它。这不是一个好的宝石,因为要看到一个简单的变化,你必须编译/发布/安装宝石。所以宝石是不对的。

建议的方法是保持所有这些“个人”代码或多或少模块化,以便我可以将其“填充”到新的rails项目中,并将其编辑为普通的rails代码(无宝石编译/发布)。

我想到的两个词是引擎和插件,但我真的不太了解它们中的任何一个是如何工作的。我也听说过(令人困惑的)“模板”,而不是视图类型。

你有什么建议。我很想知道这个问题!

3 个答案:

答案 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 concernssingle responsibility principle

但是,你不能只编写好的代码并保留它,你需要有一个很好的方法来分发你的代码。我的LAN上有一个开发服务器,它托管了许多私有Git存储库,但是您可以使用任何VCS或DVCS来保持代码的有序性。然后,当我需要更新它们并进行更改时,我可以使用它来保持我的项目从服务器获取最新版本的文件。如果我的工作项目的需求发生变化,我总是可以分支。使用Git我总是在版本控制中使用我的代码,所以我使用submodules让我保持最新版本的代码方便和最新。

如果您需要更多信息或者如果您不使用Git,请告诉我,我可以在您熟悉的VCS上查找类似的功能。另外我还想指出,这是一个很好的问题,有很多要点,我很高兴你问过,因为我记得在努力解决这个问题,我相信其他人也在解决同样的问题。

答案 2 :(得分:0)

当我为我的应用程序编写sw时,我觉得可以在其他项目中重复使用,我将其编写为自己的插件。

我从我正在使用的其中一个插件中复制插件目录模型。