Если хотите
"Hi #{user.name}, ...."
в вашей базе данных, используйте одинарные кавычки или экранируйте #
с обратной косой чертой, чтобы Ruby не интерполировал вещи #{}
сразу:
s = 'Hi #{user.name}, ....'
s = "Hi \#{user.name}, ...."
Затем, позже, когда вы захотите выполнить интерполяцию, вы могли бы, если бы вы осмеливались или доверяли себе, использовать eval
:
s = pull_the_string_from_the_database
msg = eval '"' + s + '"'
Обратите внимание, что для работы eval
вам придется превратить s
в строку в двойных кавычках. Это будет работать, но это не самый хороший подход и оставляет вас открытыми для всевозможных странных и запутанных ошибок; все должно быть хорошо, если вы (или другие доверенные лица) пишете строки.
Я думаю, вам лучше использовать простую систему микро-шаблонов, даже такую простую, как эта:
def fill_in(template, data)
template.gsub(/\{\{(\w+)\}\}/) { data[$1.to_sym] }
end
#...
fill_in('Hi {{user_name}}, ....', :user_name => 'Pancakes')
Конечно, вы можете использовать любые разделители, которые вы хотели, я пошел с {{...}}
, потому что в последнее время я использовал Mustache.js и Handlebars.js. Эта наивная реализация имеет проблемы (без параметров форматирования в шаблоне, без экранирования, ...), но этого может быть достаточно. Если ваши шаблоны усложняются, возможно, String#%
или ERB
могут работать лучше.