分享 吐槽一下 widget

piginzoo · 2012年03月01日 · 最后由 huacnlee 回复于 2012年03月02日 · 2991 次阅读

作为一个 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,这里吐槽一下:

  1. 这东西挺好,有生成器,都生成在 widget 目录下,锦簇
  2. 这东西严重依赖于 jquery 或其他 ajax 框架,要做 widget 页面内的跳转,就得靠 Jquery 的 replaceWith 了 3.有了 xdite 说的 mini-controller,可以在控制 widget 内部的页面需要的数据准备,或者是 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/

Cells 用起来挺好的啊,可以很好的将复杂的结构细化下去,而有不会混乱。

@huacnlee ,对 Widget 啥感觉呢?Cells 只解决了 View 显示的问题,说白了,就是加入了一个 mini-controller 来做显示数据的预处理,并且优化了嵌套。 但是 Widget 是全套,是完整的业务模块的 CRUD 的办法,看上去很美。

Widget 没用过

需要 登录 后方可回复, 如果你还没有账号请 注册新账号