Экранирование кавычек из переменных Rails при использовании их для Javascript? - PullRequest
15 голосов
/ 31 января 2010

У меня проблемы при попытке использовать переменную 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 превращает ' в \', а не \\', есть ли у кого-нибудь предложения, как с этим справиться?

Спасибо! Eric

1 Ответ

29 голосов
/ 31 января 2010

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

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

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

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

alert('I'm testing');

обратная косая черта исчезла еще до того, как на нее взглянул JavaScript. Когда вы пишете строковый литерал JavaScript внутри строкового литерала Ruby, вам нужно избежать экранирования, \\, чтобы получить реальный \, который затем в 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, включая окружающие кавычки.

...