Совместное использование шаблонов с Rails и Javascript - PullRequest
1 голос
/ 01 октября 2009

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

Моя проблема в основном в том, что я перечисляю данные, которые будут генерироваться при загрузке RoR, а затем иметь элементы управления JS для просмотра подмножеств. Я бы предпочел не поддерживать две версии того же HMTL. Так что мое решение таково: у меня есть рубиновый фрагмент, который выглядит примерно так:

<% value1 = jsmode ? '#{value1}' : object.value1
value2 = jsmode ? '#{value2}' : object.value2 $>
<div class="object_template">
<div><$= value1 $></div>
<div><%= value2 %></div>
</div>

Поэтому, когда я рендерим партиал с помощью ruby, я передаю jsmode из false, и он рендерится как обычный партиал. Затем я сделаю рендеринг частичного снова, завернутый в div с идентификатором шаблона, но на этот раз с jsmode из true. Это отобразит HTML со строками # {}. Затем я могу передать шаблон прототипу объекта Template следующим образом:

new Template($('template')).evaluate({value1: '111', value2: '222'});

Итак, мой вопрос, есть ли лучший способ сделать это?

Я знаю, что могу использовать конструкцию # {} для передачи переменных в RoR, если я заключу их в двойные кавычки, но мне нужно # {} для рендеринга для шаблона JS.

Мысли

1 Ответ

1 голос
/ 04 октября 2009

Общий подход выглядит хорошо и, возможно, в некоторых случаях, возможно, немного лучше, чем то, что я делал раньше.

Тем не менее, мне кажется, что вы фактически выводите версию JS в div, а затем передаете ее в шаблон прототипа. Шаблон также принимает строку, так что вы можете просто передать ей необработанный шаблон js. Если я что-то не упустил, div #template сам по себе не нужен. Таким образом, строковый маршрут, вероятно, лучший путь.

Из Rails это, вероятно, будет выглядеть примерно так:

<script type="text/javascript">
  var raw_template = "#{escape_javascript(render(:partial => 'template', :locals => { :jsmode => true }))}";
  var output = new Template(raw_template).evaluate({value1: '111', value2: '222'});
  // Do something with the output
</script>

escape_javascript использует следующую карту:

JS_ESCAPE_MAP = {
  '\\'    => '\\\\',
  '</'    => '<\/',
  "\r\n"  => '\n',
  "\n"    => '\n',
  "\r"    => '\n',
  '"'     => '\\"',
  "'"     => "\\'" }

Это означает, что, учитывая предложенный вами шаблон, вы должны получить результат в виде:

 var raw_template = "<div class=\"object_template\">\n<div>#{value1}<\/div>\n<div>#{value2}<\/div>\n<\/div>";

Что должно хорошо сработать.

...