Рендеринг частичного внутри js.erb.Можно ли получить необработанную строку, чтобы я мог удалить пробелы? - PullRequest
6 голосов
/ 29 августа 2011

Я хочу визуализировать частичное в своем файле js.erb, чтобы я мог использовать сгенерированный HTML в своем Javascript.Вот пример кода, который можно использовать в качестве примера.

create.js.erb

$(function(){
  var html = "<%= render(:partial => `pretty_box`) %>";
  $("#container").prepend(html);
});

_pretty_box.html.haml

.pretty_box_container
  .title
    Something Pretty

Когда рендерит create.js.erb, я получаю следующее:

$(function(){
  var html = "<div class="pretty_box_container>
    <div class="title">
      Something Pretty
    </div>
</div>";
  $("#container").prepend(html);
});

Как и следовало ожидать, это нарушает мой JavaScript.Мне нужно убрать пробел из результата рендеринга частичного.Проблема заключается в том, что возвращаемое значение render представляет собой объект ActiveSupport::SafeBuffer, который переопределяет все «небезопасные» методы (см. UNSAFE_STRING_METHODS ), включая strip.Поэтому вызов render(:partial => pretty_box ).strip HTML-кодирует всю строку.

Я пробовал все виды комбинаций, используя методы html_safe или to_s.Они не работают, потому что они возвращают self, и использование raw также не работает, потому что это вызывает to_s.html.safe.

Я знаю, что могу добавить > и < символы к моемуЧерт возьми, но я не хочу делать это для каждой строки каждого частичного.

1 Ответ

8 голосов
/ 29 августа 2011

Проблема не в пробелах, а в кавычках.

$(function(){
  var html = "<div class="pretty_box_container>
                         ^
                         This is where you go wrong

Попробуйте это:

$(function(){
  var html = "<%= escape_javascript(render(:partial => 'pretty_box')) %>";
  $("#container").prepend(html);
});

Проверьте этот ответ в StackOverflow для объяснения о escape_javascript.

...