Разрешить пользователям настраивать строки, которые позже интерпретируются с помощью встроенных выражений - PullRequest
0 голосов
/ 07 апреля 2011

Первоначально мы создали сервис на Rails, который использовал статические строки со встроенными выражениями (# {}) для значений, таких как datetime объекта. Эти строки использовались для построения связи с другими пользователями.

Мы хотим предоставить нашим пользователям возможность настраивать текст по умолчанию со встроенными выражениями.

В настоящее время они разбросаны по всем нашим моделям, контроллерам и представлениям, но мы хотим разместить их все в одном месте (например, локализация, но она отличается для каждого пользователя).

Наше первоначальное намерение - использовать MongoDB (через MongoMapper) для создания документа настройки, в котором хранятся строки. Затем мы можем непрерывно добавлять новые строки без выполнения миграции.

Мы будем хранить строку примерно так:

"Testing out a string at #{object.datetime}."

Позже пользователь может использовать форму, которую мы должны отредактировать для этой строки (изолированные от других пользователей).

Тогда, когда мы захотим использовать строку, мы либо заменим # {} на значение, либо как-то скажем, что встроенное выражение вычислит.

Вопрос: как позже вычислить строку со встроенными выражениями после ее определения? Есть ли что-то вроде to_sym для создания символов?

Есть ли лучший способ сделать это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

Вы захотите использовать или написать свой собственный движок шаблонов.Под шаблонным движком я подразумеваю нечто простое:

values = {"foo" => "bar"}
"turn this {{foo}} into bar".gsub(/\{\{.+?\}\}/) do |x|
  values[x[2..-3]]
end

# => "turn this bar into bar"

Для этой цели вам также могут понравиться жидкость или усы.Вы можете отвергнуть любые решения, связанные с eval: они небезопасны с ненадежными строками.

Что касается хранения значений конфигурации, mongo выглядит нормально.

0 голосов
/ 08 апреля 2011

Видимо, фасеты позволяют это сделать, используя String.interpolate. Я сталкивался с этим во время просмотра этого видео этим утром.

...