作为一个 rails 新手,我一直想了解 rails 有没有一个组件化设计的方案,我自己写了一个图片增删改查浏览的模块,我管他叫模块,是因为我把能和图片处理相关的东西尽可能地放到了一起,我是怎么做的呢?
1.首先我做图片的 nest 方式
resources :A do
resources :images
end
resources :B do
resources :images
end
还要使用多态,让图片可以跟多个 model 关联
class Image < ActiveRecord::Base
belongs_to :a, :polymorphic => true
2.我把图片的浏览的类似于幻灯片,需要嵌入到 A 或 B 的页面中的,剥离成 partail
<%= render "images/pictures", :pictures=>@a.images%>
3.我还要考虑图片的维护中的边边角角上的链接,比如 new_image 路径啥的,但因为这个 image 被多个人嵌套,所以,就得动态决定是 new_a_image 还是 edit_b_image,因此我写了个个 helper 方法
def new_the_image_path it
return new_a_image_path if it.instance_of? A
return new_b_image_path if it.instance_of? B
nil
end
最终,可以复用了,但是总觉的不爽: 1.代码还是散落,有 model,有 view,controller 2.如果我要用 image,比如我是 A 或者 B,我还要在我的 controller 中准备好相关的数据
后来就琢磨有没有更好的方案,想来 rails 大牛们一定写过这种东西吧,于是先搜到了 cells,发现只是用了 view 层显示用的,xdite 对 cell 烧香很推崇,不过,好像还达不到到复用的境界,后来顺藤摸瓜看到了 apotomo 的 widget,都是他们哥几个写的,于是吭哧吭哧看是看,拜了一下谷歌大神,中文资料奇少,于是就去他的官网上看http://http://apotomo.de/, 然后看他的 screencasts,大概搞明白了,于是照葫芦画瓢地做了个 widget,这里吐槽一下:
总体感觉,这东西适合做类似于 comments,tags 等局部显示特性强,而且,需要局部刷显得“部件”,和我想象的纯粹业务层面的复用组件,比如我上面提的 image 处理,其实,用他做就不太好用,我还是保留我的那个做法了。总之,这东西挺好,用一用可以做出一些复用性比较强的小组件,但是,没办法大范围地采用到项目中,我的感觉,吐槽完毕。
widget 的文章: http://apotomo.de/ 没了
关于 cells 的文章: http://kpumuk.info/ruby-on-rails/simplifying-your-ruby-on-rails-code/ http://blog.xdite.net/posts/2011/12/04/misunderstanding-about-render/ <----绝对好文 http://rdoc.info/github/apotonick/cells/master/file/README.rdoc http://mikepence.wordpress.com/2008/03/16/cells-bring-clean-re-use-to-your-rails-views/ http://ruby-china.org/topics/135 http://nicksda.apotomo.de/2010/11/lets-write-a-reusable-sidebar-component-in-rails-3/ http://lostechies.com/derickbailey/2011/04/11/cells-partial-controllers-and-views-for-rails-3/