В строке формата отсутствует спецификатор типа поля . Указатель типа поля является обязательным в строке формата.
Мне не понятно, почему в первом примере не возникает ошибка, поскольку отсутствует обязательный спецификатор типа поля. Это может быть ошибка, или я полностью неправильно читаю документацию.
Однако мне не понятно, почему вы считаете этот пример работоспособным:
template_string = "class=btn submit-button %<additional_classes>"
format(template_string, additional_classes: 'some-class')
#=> 'class=btn submit-button %'
# ↑
Как видите, %
интерпретируется не как часть строки формата, а как литерал %
. Я бы посчитал это ошибкой, это должно вызвать ошибку, как во втором примере.
Во втором примере вы можете ясно увидеть проблему:
ArgumentError: malformed format string - %'
↑
Поскольку строка формата должна иметь спецификатор типа поля, а единственным символом после %
(кроме имени поля) является '
, это интерпретируется как спецификатор типа поля. А поскольку '
не является допустимым типом поля, format
вызывает ошибку, в которой он явно сообщает, что интерпретировал '
как часть строки формата.
Поскольку вы хотите форматировать строки, вы должны использовать спецификатор типа поля s
(string):
template_string = "class=btn 'submit-button %<additional_classes>s'"
# ↑
format(template_string, additional_classes: 'some-class')
#=> "class=btn 'submit-button some-class'"
# ↑↑↑↑↑↑↑↑↑↑↑
В качестве альтернативы вы можете использовать форму %{}
:
template_string = "class=btn 'submit-button %{additional_classes}'"
# ↑ ↑
format(template_string, additional_classes: 'some-class')
#=> "class=btn 'submit-button some-class'"
# ↑↑↑↑↑↑↑↑↑↑↑