查看模型中的逻辑

时间:2012-05-15 11:00:23

标签: ruby model-view-controller

我有一个这样的模型:

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用Rails View Helpers,这是一种简单直接的方法。恕我直言,助手往往最终成为各种事物的垃圾抽屉。因此,我们更喜欢使用Deocrator Pattern。这样做的好宝石是draper

答案 1 :(得分:1)

这是rails中 Helper Class 的目的。

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)

视图还具有relatively easy to write unit tests for的优势。