我有两个在同一个数据库上运行的rails应用程序,一个运行客户端,另一个提供管理界面.
这两个应用程序都具有完全相同的模型定义,除了少量的差异.我很厌烦将模型中的绝大多数更改复制到两个应用程序.
两个应用程序使用相同模型信息的一种方法是将模型文件夹从一个应用程序符号链接到另一个应用程序,但由于代码中的一些差异(例如客户端上的额外验证),我无法做到这一点.
有没有一种简单的方法可以解决差异,以便将公共代码保存在一个地方?
svn:externals或git子模块绝对是这种情况的出路.
当然,您希望能够在两个应用程序中测试它们,因此您也应该共享您的模型测试或规格.但请记住,模型通常依赖于插件,所以你也想分享你的插件文件夹.你可能想要相同的宝石和相同版本的Rails,所以你最好的选择是分享所有的供应商.哦,有时你的lib中的代码会修改你的模型,所以你要分享它.哦,并确保在环境文件中共享任何自定义配置.
并且您希望设置一个持续集成服务器来在两个应用程序上运行测试套件,以防主应用程序中模型层的更改破坏您的其他应用程序.
但我的意思是,一旦完成所有这些,svn:externals或git子模块绝对是这种情况的方法.
更新 (几年后)
Rails Engines可能是目前在多个应用程序之间可靠地共享模型代码的最佳选择.它们可以被宝石化并包含在Gemfile每个应用程序中.
为什么不以OOP方式进行,例如创建一个单独的基类(在一个单独的目录中),然后在两个项目中继承它,因此差异在继承的类中.
所以你有了
class BaseModel < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)
在"common"子目录中,然后你就拥有了
class AdminBaseModel < Common::BaseModel
Run Code Online (Sandbox Code Playgroud)
在管理项目和
class UserBaseModel < Common::BaseModel
Run Code Online (Sandbox Code Playgroud)
你可能需要
set_table_name "basemodel"
Run Code Online (Sandbox Code Playgroud)
所以Rails知道要打开哪个表.
只是好奇 - 为什么不拥有一个具有两种模式的应用程序?
我有一个应用程序,它看起来像是十几个不同的应用程序之一,具有不同的品牌和不同的功能,具体取决于您进入的 URL 以及您登录的身份。我的用户有角色,我向 ActiveRecord::Base 添加了一个方法来为您提供当前用户。因此我可以做类似的事情:
MAX_VOLUME = current_user.admin? ? 11 : 10
validates_inclusion_of :volume, :in => 0..MAX_VOLUME # Admins can go to 11!
Run Code Online (Sandbox Code Playgroud)
在视图中,类似这样的东西:
<%= render :partial => common_tabs %>
<%= render :partial => admin_tabs if @current_user.admin? %>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8436 次 |
| 最近记录: |