0

我有一个这样的模型:

class MyModel
  attr_accessor :size
end

现在我想以人类可读的格式显示大小。我可以通过添加以下代码来做到这一点:

class MyModel

  attr_accessor :size

  def size_hr(bytes = nil, counter = -1)
    counter += 1
    bytes ||= size
    if bytes < 1024
      return "#{bytes.round(2)} #{unit_for(counter)}"
    else
      size_hr bytes/1024, counter
    end
  end

  def unit_for(counter)
    case counter
    when 0 then "B"
    when 1 then "KiB"
    when 2 then "MiB"
    when 3 then "GiB"
    end
  end
end

但是我对此感到有些不好,因为我会将视图内容混合到模型中。我正在寻找一种设计模式,这将是做到这一点的正确方法。我读过关于装饰者和演示者的文章,但我认为它们不适合这里。什么是正确的方法?

4

2 回答 2

2

您可以使用 Rails View Helpers,这是一种简单直接的方式。恕我直言,帮助者最终会成为各种事情的垃圾抽屉。因此,我们更喜欢使用Deocrator Pattern。做到这一点的好宝石是draper

于 2012-05-15T11:28:29.947 回答
1

这是Rails中Helper 类的目的。

出于这个原因,Helper 类有时也称为View Helpers 。

在文件/app/helpers/my_model_helper.rb中,您将定义这个模块(rails 自动混入)。

module MyModelHelper

  def size_hr(@my_model, counter = -1)
    counter += 1
    bytes = @my_model.size
    if bytes < 1024
      return "#{bytes.round(2)} #{unit_for(counter)}"
    else
      size_hr bytes/1024, counter
    end
  end

  def unit_for(counter)
    case counter
    when 0 then "B"
    when 1 then "KiB"
    when 2 then "MiB"
    when 3 then "GiB"
    end
  end

end

然后在您看来,您只需像这样调用该方法:

size_hr(@myModel)

视图还具有相对容易编写单元测试的优点。

于 2012-05-15T11:03:58.620 回答