浏览 3192 次
锁定老帖子 主题:咱也谈,谈rails的分模块开发
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-10
最后修改:2009-11-11
在rails中,通过namespace来组织代码(其实是隐去了模块的概念)。 这需要考虑几个方面的问题: 1.table name; 2.migration name; 3.route; 4.controller; 5.view; 6.model; 7.test. ... 下面以在admin名字空间下的post为例来说明如果使用namespace: 一、关于表名:为了避免表名冲突,可以使用admin_posts这样的表名。这样做,要在model中要调用 set_table_name "admin_posts" 有人说这样作违反了"Convention over configuration"的原则,我认为这个原则是为了方便人的使用的,感觉不方便时就不必遵守。当然,如果你是“Convention over configuration 偏执狂”的话,直接使用posts作为表名也是一样的,毕竟如何组织表名并不是rails的职责。只不过这时要考虑避免表名冲突。 二、关于迁移文件名:同样可以依你的喜好考虑是不是使用create_admin_posts这样的文件名。我有个朋友更干脆,每个模块建一个迁移文件!代码组织很整齐。不过,需要更改时他就会哭了。 三、关于route,这个没有什么有说的。 map.namespace :admin do |admin| admin.resources :posts end 四、controller中:由于model在namespace中,用到model的地方,如果不在同一个namespace中时,要使用其qualified name,即写成 Admin::Post 的形式。另外还有一处要注意,与view有关。下面再说。 五、view中:与namespace相对应,params[:post]改成了params[:admin_post],因此,controller中要用params[:admin_post]。 六、model中:除了前面提到的set_table_name外,如果要关联其它namespace中的model时,要指定:class_name,还要用qualified name。同一个namespace中则不用(好象通过中间Model的多对多关联时也要用qualified name)。 什么?又来了!我又听见有人在说”Convention over configuration”的事,说什么使用了:class_name就不Convention over configuration了。我觉得这里使用:class_name是很自然的事情。难道还有其它解决办法吗? 七、关于test:惨了,写了这么多年程序,从来没写过测试代码。因为我不会写,所以我不知道该怎么处理。还请哪位达人来说一说。看来我也要学一学了。 最后是关于scaffold生成使用namespace的代码问题。 目前,用scaffold可以生成使用namespace的代码。但是,不能运行! 以前就听人说过:如果你目前不使用scaffold还不能编写rails程序,那就暂时不要用namespace! 不过scaffold确实还为我们做了大量工作,如果你喜欢用还是可以用的,只是要做些修改: 1.Scaffold生成的表名是admin_posts形式的,所以在model中要加上set_table_name(或者你也可以将表名改成posts的形式); 2. Scaffold生成的migration文件名是create_admin_posts形式的,当然你也可以改; 3. Scaffold生成的controller#index中,实例变量名是@admin_post 与view中不一致,改成@post就好了,params[:post]要改成params[:admin_post],以与view中的一致。至于那些url 也要改了。 4.view中的url也要改了。 5.route中的 map.resources :posts改成 map.namespace :admin do |admin| admin.resources :posts end 别问我测试代码要怎么改,我也不知道! 好了,就这些,可以用了。 Scaffold还是方便一点啊。 Scaffold只是一个工具,能为我们做到这些已经不错了。当然我们希望Scaffold能更好! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-10
引用 五、view中:与namespace相对应,params[:post]改成了params[:admin_post],因此,controller中要用params[:admin_post]。
你确信没有搞错? |
|
返回顶楼 | |
发表时间:2009-11-11
机器人 写道 引用 五、view中:与namespace相对应,params[:post]改成了params[:admin_post],因此,controller中要用params[:admin_post]。
你确信没有搞错? 这要看你的form_for怎么写了。 如果这样写 <% form_for(@post) do |f| %> 那就没错了,就是params[:admin_post]。 如果你写成 <% form_for(:post, @post) do |f| %> 那就又不同了。就是params[:post] |
|
返回顶楼 | |
发表时间:2009-11-12
曾经试过这样写,但发现用scaffold生成之后的文件,几乎每个都要改
若不使用scaffold,手动写起来也比较麻烦 不知道rails在未来版本会不会对此支持好一些 |
|
返回顶楼 | |
发表时间:2009-11-13
我也试过使用namespace,但是它没有带给我方便,反而令我抓狂。最后放弃,因为我用rails,就是为了方便的。
|
|
返回顶楼 | |
发表时间:2009-11-16
建议 admin 部分 用 namespace 分层
|
|
返回顶楼 | |