论坛首页 编程语言技术论坛

咱也谈,谈rails的分模块开发

浏览 3192 次
精华帖 (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能更好!
   发表时间:2009-11-10  
引用
  五、view中:与namespace相对应,params[:post]改成了params[:admin_post],因此,controller中要用params[:admin_post]。

你确信没有搞错?
0 请登录后投票
   发表时间: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]
0 请登录后投票
   发表时间:2009-11-12  
曾经试过这样写,但发现用scaffold生成之后的文件,几乎每个都要改
若不使用scaffold,手动写起来也比较麻烦

不知道rails在未来版本会不会对此支持好一些
0 请登录后投票
   发表时间:2009-11-13  
我也试过使用namespace,但是它没有带给我方便,反而令我抓狂。最后放弃,因为我用rails,就是为了方便的。
0 请登录后投票
   发表时间:2009-11-16  
建议 admin 部分 用 namespace 分层
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics