Rails 如何把握 DRY 的度?

suffering · 2012年03月20日 · 最后由 suffering 回复于 2012年03月20日 · 3502 次阅读

在 Rails 编程中,感觉很难把握 DRY 原则的度。

比如说有一个流程,建立 product 模型。 编程 MVC 将所有的功能都做好了。 routes.rb 如下:

  match '/products/:id/hide' => 'products#hide', :as => :hide_product
  match '/products/:id/release' => 'products#release', :as => :release_product
  match '/products/offlines' => 'products#offline', :as => :product_offline
  resources :products do
    collection do
      post 'sort'
    end
  end
end


现在要加一个独立后台,运行rails generate controller Cpanel::Products. 至此,在 routes.rb 里除了原本的resources :products外又多出了:

namespace :cpanel do
  resources :products
end


到这一步得去编辑 namespace,将算定义的 hide,release,offlines,sort 之类的方法重写一次。

同时,views 里相应地也建立了 cpanel/products, controllers 里相应建立了 cpanel/products_controller.rb 文件。

于是又得将已经写好的 view 与 controller 重写一次。 当然,可以直接render :file => 'products/show',render :file => 'products/index',但是,很明显,如果 render 'products/form'的话在后台里编辑后会直接跳转到前端 show 页面。

这样的话,routes,views,controllers 里多出了许多只有细微差别的代码。虽然只要 copy 一下,但是感觉上却非常糟糕,很明显是违背 DRY 原则的。

在这种情况下,有什么好的解决方案?copy 不累人,只是这样整出的代码自己都觉得无法原谅。

将算定义的 hide,release,offlines,sort 之类的方法重写一次。

这个。。。inheritance 和 composition 不是 OOP 最基本的理念嘛。。。为啥要重写一次这些方法?

View 里不一样的东西也可以在 controller 里控制啊。

#1 楼 @fredwu ,有没有好的学习资料或者案例推荐一下?routes 与 controller 的 inheritance 和 composition 技巧木有怎么接触过,感觉有点茫然。

routes 是个 manifest,没法 DRY 的。controller 的话,如果大部分功能类似,你可以继承,如果只是小部分功能类似,可以用 mixin。

Controller 的 composition 例子我手上没有,但 model 的例子可以看这个: https://github.com/fredwu/angel_nest/blob/master/app/models/startup.rb https://github.com/fredwu/angel_nest/tree/master/app/models/concerns

#1 楼 @fredwu ,你的 angel_nest 里的 gem inherit_resources,感觉上不好把握。

#4 楼 @suffering 啊,我的一个管理系统大量使用了 inherit_resources。因为那个管理系统基本上就是各种 CRUD

@_@ ,唔?那我得好好研究一下。有时,木有时间磨刀就被赶去砍树了。 隔段时间回头看自己的代码,总是觉得惨不忍睹。

#4 楼 @suffering inherit_resources railscast 上有视频,README 上也很长,你可以通过使用它的项目一点点对照着看。其实它的很多‘抽象’都是用不到的,除非你真正懂了怎么用。rails-bestpractices.com这个更加‘变态’。

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