Rails view 中的逻辑处理,helper vs draper?

richfisher · 2012年01月05日 · 最后由 ery 回复于 2012年02月04日 · 3992 次阅读

helper 大家都很熟悉,不多说。

Draper 的英文介绍是 View Models for Rails,给 model 对象添加显示相关的职责,以下是自己写的两个例子。

class UserDecorator < ApplicationDecorator
  decorates :user

  def full_name
    model.first_name + model.second_name
  end
end

class ArticleDecorator < ApplicationDecorator
  decorates :article

  def created_at
    model.created_at.to_s(:db)
  end
end

假设 Article belongs_to Category 要在 view 中显示 cateogry 的连接 1、Drapper 的做法:

class ArticleDecorator < ApplicationDecorator
  decorates :article

  def category_name
    model.category.name if model.category.present?
  end

  def category_link
    h.link_to category_name,h.category_path(model.category) if model.category.present?
  end
end

在 view 中 = @article.category_link

2、helper 的做法

module ArticleHelper
  def show_category_link(article)
    link_to article.category.name, category_path(article.category) if article.category.present?
  end
end

在 view 中 =show_category_link(article)

哪种方法更好呢?大家对 draper 怎么看呢? 如何区分两者的适用场合呢?

我觉得 draper 看上去挺好的。能让 view 层看上去更干净。。不过原理应该和 helper 没什么区别吧。只是不同的方式。

我偏向减少层次。而且有时 helper 适应性更广,比如 format_time, format_body。改一次,全站应用。

早几天看过一下 draper,没实践过,有空在项目里面测试下

#2 楼 @Rei 但有些方法是模型特有的 比如 User#full_name,UserAddress#to_s(以某种格式显示用户地址)会在多个 Controller 中用到。 假如将多个 Controller 共用的 helper 提取到 ApplicationHelper,ApplicationHelper 就爆炸了。

更广义的 view,不仅仅是网页 html,还可以是图片 jpg 业务上,我要在后台 html 看到用户的订单信息,还要生成订单信息的图片 jpg 打印出来。 生成图片我用 RMagick,这时 helper 就帮不上忙了,Draper 显得更合适。

#4 楼 @richfisher 其实我最近发现 helper 很灵活的 就是一个独立的 module,不和任何类有关联 想怎么用就怎么用,唯一的魔法就是根据名字被注入到 view 里了。 所以解决你说的问题很简单,在哪几个 controller 里多次用到就 include 到哪个 controller 特别通用就放到 application controller 至于和 model 紧密相关并且和显示相关的也可以解决嘛,只是不那么 OO,有点过程式的味道。

module UsersHelper
  def render_full_name(user)
    user.first_name + user.last_name
  end
end

#4 楼 @richfisher

可以在 Controller

helper 'users'

也可以在 Helper

include UsersHelper

@hooopo 是呀 helper 感觉很过程,Draper 的写法才面向对象

前几天@xdite才刚在说 Logic in View 的事情⋯⋯性能问题啊。。。 http://blog.xdite.net/posts/2011/12/04/misunderstanding-about-render/

Draper 的写法不错,但是我更喜欢 Helper, 我写了一个扩展 helper 的 gem, 把一些 helper 方法封装起来了, https://rubygems.org/gems/showbuilder https://github.com/ery/showbuilder https://github.com/ery/showbuilder/blob/master/lib/showbuilder/show_model_view.rb 不过很遗憾,还没来得及写 demo, test and document。

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