Может ли рубиновый Усы лямбда получить интерполированное значение?

Шаблоны предлагают некоторую степень безопасности типов.

1
задан AndyV 2 March 2019 в 01:42
поделиться

1 ответ

То, что вы действительно хотите сделать, это добавить логику, так что самое простое, что нужно сделать, это просто применить ее:

context.each do |product|
  product[:price] = to_currency.call(product[:price])
end

Однако, я изучил это более глубоко и обнаружил, что вы можете do это создать класс 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)

Я никогда не использовал Усы до этого, и я думаю, что разделение между логикой и шаблоны - это здорово!

0
ответ дан Kache 2 March 2019 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: