各位大家好,初来 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 上去了
--基本上分离成功了,剩下就是仔细调整了,最好能够跑原来的测试用例,就无敌了