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