2016-06-07 2 views
3

В моем коде я хочу использовать строчную интерполяцию для темы электронной почты, которую я генерирую.Строчная интерполяция с помощью надстроек

output = "this is my %{title}" % {title: "Text here"} 

Это работает, как ожидалось, но есть способ использовать хэш внутри хэш и все еще быть в состоянии использовать интерполяцию строки?

Было бы удивительным, если бы я мог сделать что-то вроде:

output = "this is my %{title.text}" % {title: {text: "text here"}} 
+2

Это не строковая интерполяция, это просто вызов метода ['String #%'] (http://ruby-doc.org/core-2.3.1/String.html#method-i-25), используя синтаксис оператора. –

+1

Выглядит странно. Пробовали ли вы '% {title [: text]}'? – sschmeck

+1

, чтобы добавить комментарий @sschmeck .... '.' нотация не работает на' hash'es .... – ptierno

ответ

2

Я не думаю, что это возможно с % методом. Вы должны использовать обычную интерполяцию Ruby с "#{}". Я также хотел бы указать, что вы можете использовать OpenStruct.

title = OpenStruct.new(text: 'text here') 

output = "this is my #{title.text}" 
0

Это на самом деле не сложно сделать эту работу, если вы пишете простой метод полезности для «сквош» ключи вложенной хэш-функции, в например:

def squash_hash(hsh, stack=[]) 
    hsh.reduce({}) do |res, (key, val)| 
    next_stack = [ *stack, key ] 
    if val.is_a?(Hash) 
     next res.merge(squash_hash(val, next_stack)) 
    end 
    res.merge(next_stack.join(".").to_sym => val) 
    end 
end 

hsh = { foo: { bar: 1, baz: { qux: 2 } }, quux: 3 } 

p squash_hash(hsh) 
# => { :"foo.bar" => 1, :"foo.baz.qux" => 2, :quux => 3 } 

puts <<END % squash_hash(hsh) 
foo.bar: %{foo.bar} 
foo.baz.qux: %{foo.baz.qux} 
quux: %{quux} 
END 
# => foo.bar: 1 
# foo.baz.qux: 2 
# quux: 3 
2

В Ruby 2.3 sprintf проверяет значение хэш-по умолчанию , чтобы вы могли обеспечить default_proc для dig вверх вложенного значения:

hash = {title: {text: "text here"}} 
hash.default_proc = proc { |h, k| h.dig(*k.to_s.split('.').map(&:to_sym)) } 

"this is my %{title.text}" % hash 
#=> "this is my text here" 

Вид Hacky, но это, кажется, работает.

Смежные вопросы