Вывод кавычек из Rails Variables при использовании их для Javascript?

У меня возникают проблемы при попытке использовать переменную rails в javascript-коде.

Например, я могу определить link_to_remote, с параметром :complete => "alert('my_var');"

Если my_var = "I'm testing.", тогда код javascript сломается из-за того, что одинарная кавычка преждевременно закрывает код. Если я попытаюсь использовать escape_javascript(my_var), чтобы цитата превратилась в \', она, похоже, не устраняет проблему.

Я заметил, что при попытке alert('I\'m testing'); возникает проблема, но если вы делаете alert('I\\'m testing'), она работает. Поскольку escape_javascript только превращает ' в \', а не \\', есть ли у кого-нибудь предложение о том, как с этим справиться?

Спасибо! Эрик

Ответы

Ответ 1

при попытке alert('I\'m testing'); возникает проблема

Обратная косая черта также является побегом в строках Ruby! Итак, строковый литерал:

"alert('I\'m testing');"

означает строку:

alert('I'm testing');

обратная косая черта уже ушла, прежде чем JavaScript взглянет на нее. Когда вы пишете строковый литерал JavaScript внутри строкового литерала Ruby, вам нужно избежать escape-кода \\, чтобы получить реальный \, который затем в JavaScript уберет апостроф.

escape_javascript корректно генерирует обратную косую черту для JavaScript, если обратная косая черта была включена в ее ввод. Но опять же, если вы пишете строковый литерал, вам нужно избежать обратной косой черты, чтобы получить реальную обратную косую черту:

escape_javascript("\b")     -> this is a backspace character!
escape_javascript("\\b")    -> this is backslash-then-letter-b;
                               escaped for JavaScript literal to double-backslash-then-b.

Итак, это прекрасно:

"'"+escape_javascript(myvar)+"'"

вы также можете использовать JSON-кодер для создания строкового литерала JavaScript, включая окружающие кавычки.