Homeland 考虑把 ruby-china 改装成 mountable app

hunter · 2012年03月19日 · 最后由 hunter 回复于 2012年07月31日 · 5705 次阅读

各位大家好,初来 ruby-china,有点兴奋,终于找到一个比较靠谱的 ruby 社区。

这段时间调研了 ruby 社区的论坛系统,似乎没有特别好的,看上去 ruby-china 还是很好的,于是冒出来一个想法如标题。

目前还停留在研究和学习阶段,未知最后可否实现,本人水平有限,七搞八搞也搞过一些东西,总是不上台面,各方面学习都比较肤浅,只是对新技术比较感兴趣,以及自己想法很多,总归想尝试下,特此发贴。

废话太多,基本想法是首先把用户模块剥离出去,最好的话把 theme 也可以单独剥离,其他逻辑单独保留在一个 engine 里面,自己的应用上,剥离了一下用户,感觉也不是很难。

主要难度在集成的问题,以及一些接口,我对 rails 的魔法应用也不熟悉,engine 的原理也不是很熟悉。

engine 是 controller 的父类,大概对 engine 的理解就是通过 route 里面的分离和集成,以及命名空间的作用来实现应用程序之间的联系,没有看过代码,看过一些 blog 而已,先动手,遇到问题再说。

最后的效果,就是很多 rails 的应用里面直接 mount ruby-china 应用,欢迎大家拍砖。

--为什么要 mountable 一个耦合度很低的系统,始终是软件界不灭的梦想,想象一下,每一个子系统都是独立的开发,升级,测试,直接换个版本号,就可以部署版本,是多么 Hi 的一件事情啊 rails 3 已经为我们打开了这扇大门,表面上看这个是很美好的事情。

ruby-china 的原开发人员可否提供一些指导性意见?

--刚把 ruby-china 本地运行起来

--设想 先分离 rubychina 本身为三个或者四个项目 一个为 Ruser,独立的用户相关的功能,提供用户鉴权信息给其他应用 一个为 Rforum,论坛功能 一个为 Rtheme,分离的 css 和 js 文件 gem 一个为 Rmain 项目 集成用的 rails app

--可行性 前面三个均为 engine,可以直接移植现有的代码,加上一些 engine 特殊的东西,总归难度系数不大,毕竟我们站在巨人的肩膀上,有问题应该可以得到原社区开发员的支持。

--限制 测试的问题暂时不考虑 代码更新同步问题暂时不考虑

--难点考虑 ---engine hook user_id 可能需要把用户模块中关于论坛的去掉,有几个 has_many

---可选 theme 倾向于和 js 弄成一起,因为这两个有较强关联 theme 做到绝对分离还是有难度,也 是自己拍脑袋想想的,理论上是可行的。

-需要做的

建立几个空应用,先不考虑通用性只移植现在可拆分的应用,估计要大量手工加上命名空间,然后能跑起来就不错

--权限管理 cpanel 需要移除用户管理,设想把全部用户管理相关放到用户模块 权限管理需要修改,增加论坛管理员概念和全局管理员相区别,只能够修改和论坛相关功能因为管理员往往是某一部分用户,有些论坛有 moderator 的概念。似乎目前的也可以,

#遇到的问题

--hook user_id 集成用户 id,先设想好,后面用 参考 forem belongs_to :user, :class_name => Forem.user_class.to_s

--devise 移植 https://github.com/plataformatec/devise/wiki/How-To:-Use-devise-inside-a-mountable-engine http://lanvige.com/posts/devise_2_support_with_rails_3_mountable_engine/ https://github.com/plataformatec/devise/wiki/How-To:-Upgrade-to-Devise-2.0

--研究 cell 和 engine 配合问题 - 此链接仍然无解 http://nicksda.apotomo.de/2012/03/maximum-modularity-with-cells-and-rails-engines/

--cell 问题绕过去 cells 不能识别 engine 里面的 helper 方法,已经提了 issue 给 cells,希望能够有答案,估计是一个 bug,或者可以配置下,让 cell 可以识别 engine 里面的 helper,我看到 locomotive 里面都没有用 helper,难道是故意绕开的?

--cells 和 VIEW 需要手工加载 view path 在 initialize

决定手工 include 这些 helper,看看能不能绕过去 - 答案是可以

删除论坛业务相关的 cell 在 user engine

注释掉原来的首页业务相关,先用临时的 html 来代替 engine 首页

--按照路由测试业务 下面测试用户路由了,最好把导航条弄回来,把所有路由弄在一个页面上,逐个调试

-- unintialize constant node 现在死在 devise 上了,注册的时候报 namerror unintialize node,这就是我讨厌 devise 的理由,根本不知道问题在哪里。 这个 node 似乎不是 ruby-china 的 node 问题解决,这个 node 就是 rubychina 的,来自于用户模型

--unintialize contant authorization def password_required? return false if self.guest (authorizations.empty? || !password.blank?) && super end

authorizations 不认识,哎呀怎么办,把 authorization.rb 加到 model 目录就可以,放到 ruer 目录就不行,即使已经加了 Ruser:: 是不是这个惹的祸?写死了只能是authorizations? embedded_in :user, :inverse_of => :authorizations 先不管,继续走走看。

--engine layout 居然不识别 engine helper,手工 include 解决 发现原因可能是因为被父应用的覆盖了 http://www.ruby-forum.com/topic/211017 解决方案是在 engine 初始化的时候加上这些 engine 的 helper

--居然不认识 user_path guide 里面说了,engine 内部自己可以认识的啊,为什么这里不行啊,连个办法都想不到。学习下里面只提到了 MODEL 不能识别 url_helper,可现在我们在 helper 里面啊http://stackoverflow.com/questions/341143/can-rails-routing-helpers-i-e-mymodel-pathmodel-be-used-in-models

似乎 user_path 这种写法在新的一个 rails 程序里面没有看到,虽然 routes 里面有定义 user 还是绕过去再说,我不用 helper 总行吧

--决定移除 cell 开发的时候不能自动加载改动 cell,诸多问题都和 cell 有关,水平有限,又比较懒学习,改回普通方式.cell 无非是把一小段逻辑和 view 可以弄在一起 render,用 rails view 也可以做到的,而且有命名空间风险,如果父应用有 cell,可能会覆盖,为了 moutable,先牺牲掉 CELL 虽然 cell 也可以做一些配置,而且 locamotive cms 也用了 cell,似乎人家挺好的。唉,水平低,先用简单方式解决吧,移除吧先。

--devise 不能自动加载 i18n 的中文 已经在 engine 里面配置了 default_local,外围的都可以了,就是 devise 的中文显示不行 手工再配置一遍,似乎也不难,看似很头痛的问题,过一会儿总是可以绕过去,只是我们水平有限的人,绕出来怕是四不象,打破了人家原来的完美。

--这一次又踢掉了 ubuntu 下编辑开发,回到了 windows 的怀抱,爽啊,我自己都记不得有几次这样的切换了,不过看来总是 windows 胜利,主要我是用 netbeans. 我只担心那个后面会有 resque 调试部分,其余估计问题不大

--关于 static assets 部分,预先留着这个链接待后面学习 http://jonswope.com/2010/07/25/rails-3-engines-plugins-and-static-assets/

--心得 ---父应用中的同名 view 会自动覆盖 engine 里面的 view 名字,layout 同理 ---移植老代码到处是命名空间的地雷,最好一个小模块一开始就从一个 engine 开始调试,会顺利一点

--进度 四个空应用已经建立准备移植用户代码 用户 engine 已经起来,相关 GEM 已经载入,正在解决 view 配合问题,原来的代码不是 engine friendlly:( --大部分的用户部分已经调通,计划再完善和测试一下 2012-3-25 --rtheme 也点起来,看上去界面就和原来的差不多了 --开始折腾 rforum 了

开始写点测试吧,我还是喜欢用 watir-webdriver 和 chrome,简单的

用户注册关打通,累死了,全部分离好,估计有一个月左右的工作量,按我这种比较菜的能力,强的人估计一个星期全部弄好了

晚上折腾自己写的烂程序,白天有空搞搞,感觉只要有时间应该可以弄好的,也是一个学习的好机会。

--engine 知识参考 1.railscast 里面搜索 2.google mountable app http://piotrsarnacki.com/2010/12/21/mountable-apps-tutorial/ --官方指导,匆匆看了下 http://api.rubyonrails.org/classes/Rails/Engine.html http://edgeguides.rubyonrails.org/engines.html http://edgeapi.rubyonrails.org/classes/Rails/Engine.html

--加载指定文件,或许在特殊情况下用的到如果老是不识别类什么的,备忘下 class MyEngine < Rails::Engine # Add a load path for this specific Engine config.autoload_paths << File.expand_path("../lib/some/path", FILE)

initializer "my_engine.add_middleware" do |app| app.middleware.use MyEngine::Middleware end end

--has_many namespace http://stackoverflow.com/questions/8516894/what-files-are-loaded-after-modifying-the-controller-file

--访问 current_user in model http://stackoverflow.com/questions/3742785/rails-3-devise-current-user-is-not-accessible-in-a-model

--how to apply engine into main app http://stackoverflow.com/questions/5159607/rails-engine-gems-dependencies-how-to-load-them-into-the-application

need add some require in engine file

-- 代码共享空间

https://github.com/grasp/rubychina 希望有心人一起开发

--目前进展顺利,因为老是 push 不到 github 上去,代码只好放到自己的 gitlab 上去了

--基本上分离成功了,剩下就是仔细调整了,最好能够跑原来的测试用例,就无敌了

好想法,我也曾经有这么想过,以后一些项目的用户反馈栏目就可以直接 mount 一下就有了,省去重复的开发工作。

希望楼主分享经验 我们最近也有把公司项目分拆然后 mount 的计划

#1 楼 @huacnlee

您的意思是 ruby-china 除了用户可以剥离外,其他还可以再拆分吗?还不清楚里面各 controller 里面的耦合度,要折腾下才知道了

就是把论坛的功能剥离出来,类似 Devise 的做法。

嗯,除了用户系统外,其他就是可以作为一个独立系统来 mount 了,css 和 js 也可以考虑分离,目前自己的还没有完全分拆好,理论上不难的,就是增加 namespace

支持,lz 可以 fork 一下,看看这 engine 怎么搞,到时分享一下

是个好想法

看来大家都有兴趣,大家一起来啊,团队合作还是比较靠谱一点,可以各自领取子项目,有兴趣的报名啊

关于 engine 除了 railscasts 以外还有什么好的资料么?

#9 楼 @cqpx 打算下次上海的 RubyTuesday 上,我来给大家分享一个关于 Engine 的专题吧,到时候要不要过来一起探讨呢?

#10 楼 @lgn21st 什么时候哇?

#10 楼 @lgn21st 每次我都想来啊。。我尽量。。

#11 楼 @t_zires #12 楼 @cqpx #13 楼 @Ddl1st 下周,上海这边的 RubyTuesday 现在每隔一周安排一次了。

需要有经验的人相助,到处是地雷,已经排了一些了,devise 的魔法一来,我就歇菜了,其他的 rails 相关的还可以应付过去,估计就是个 new,然后调用 mongoid 建对象,这也会出错啊 这个 node 貌似不是 ruby-china 的 node,我找不到那里引入的 Started GET "/ruser/account/sign_up" for 127.0.0.1 at 2012-03-22 11:37:51 +0800 Processing by Ruser::AccountController#new as HTML Completed 500 Internal Server Error in 1ms

NameError (uninitialized constant Node): activesupport (3.2.2) lib/active_support/inflector/methods.rb:229:in block in constantize' activesupport (3.2.2) lib/active_support/inflector/methods.rb:228:ineach' activesupport (3.2.2) lib/active_support/inflector/methods.rb:228:in constantize' activesupport (3.2.2) lib/active_support/core_ext/string/inflections.rb:54:inconstantize' mongoid (2.4.3) lib/mongoid/relations/metadata.rb:535:in klass' mongoid (2.4.3) lib/mongoid/relations/constraint.rb:38:inconvert' mongoid (2.4.3) lib/mongoid/fields/internal/foreign_keys/array.rb:73:in serialize' mongoid (2.4.3) lib/mongoid/fields/serializable.rb:80:ineval_default' mongoid (2.4.3) lib/mongoid/fields.rb:94:in apply_default' mongoid (2.4.3) lib/mongoid/fields.rb:65:inblock in apply_non_proc_defaults' mongoid (2.4.3) lib/mongoid/fields.rb:64:in each' mongoid (2.4.3) lib/mongoid/fields.rb:64:inapply_non_proc_defaults' mongoid (2.4.3) lib/mongoid/document.rb:130:in block in initialize' mongoid (2.4.3) lib/mongoid/threaded/lifecycle.rb:84:in_building' mongoid (2.4.3) lib/mongoid/document.rb:126:in initialize' devise (2.0.4) lib/devise/models/registerable.rb:16:innew' devise (2.0.4) lib/devise/models/registerable.rb:16:in `new_with_session'

Devise 应该排除,你假设用户表叫 User,登陆用户叫 current_user

现在在用户的 Engine里面,应该不需要这两项.异常抛在devise控制器中的new方法。

问题解决,Node 来自于 user.rb 模型中,去掉这些业务相关的

怎么没有继续了,github 上也是 四个月前

最近工作调动了,变化很大,没有时间了。 另外感觉用 ruby 重新发明轮子很累,不如直接用 drupal 或者其他 cms

20 楼 已删除
hunter [该话题已被删除] 提及了此话题。 04月03日 10:58
需要 登录 后方可回复, 如果你还没有账号请 注册新账号