То, что вы действительно хотите сделать, это добавить логику, так что самое простое, что вам нужно сделать, это просто применить ее:
context.each do |product|
product[:price] = to_currency.call(product[:price])
end
Однако я углубился в это и обнаружил, что вы можетесделать, это создать Mustache
класс:
class Product < Mustache
attr_reader :name
def initialize(name, price)
@name, @price = name, price
end
def price
currency(@price)
end
private
def currency(price)
num_str = BigDecimal(price.to_s).round(2).to_s('F')
int, flt = num_str.split('.')
"$#{[int, flt.ljust(2, '0')].join('.')}"
end
end
template = <<-EOF
|Product|Price|
{{#products}}
|{{name}}|{{price}}|
{{/products}}
EOF
Mustache.render(template, products: [Product.new('Widget', 1.2), Product.new('Cog', 0.75)])
Вы можете даже динамически передавать блоки:
class Foo < Mustache
def initialize(&block)
@block = block
end
def foo
@block.call(2)
end
end
tmp = <<~TMP
Blah Blah
blah {{foo}} blah
Blah
TMP
foo = Foo.new { |x| (x + x).to_s + "asdf" }
foo.render(tmp)
Mustache.render(tmp, foo)
Я никогда не использовал Усы до этого, и я думаю, что разделение между логикойи шаблонизация это здорово!