Экранирование ввода апострофов пользователями через текстовые поля в приложении Rails?

Обновить:

Если вы посмотрите на код javascript, который я вставил в обновлении ниже, у меня есть одинарные кавычки вокруг переменнойiety.name. Я думаю, что я просто следовал учебнику в этом. Оказывается, когда я переключаю их в двойные кавычки, все работает нормально. Вопрос: это стабильное решение? Или все-таки лучше реализовать escape_javascriptпомощника?

У меня есть приложение Rails, где пользователи могут вводить значения для поля. Затем другие пользователи могут добавить это значение в свой профиль, выбрав его в раскрывающемся списке. Я использую помощник collection_select для отображения выпадающего списка. У меня есть немного JavaScript, связанный с этим раскрывающимся списком, который распознает родительский выбор, а затем отображает определенный дочерний выбор.

Проблема заключается в том, что некоторые пользователи вводят значения, содержащие апостроф. Firebug говорит мне, что апостроф нарушает JavaScript. Когда я вручную удаляю все апострофы для тестирования, JavaScript прекрасно работает.

Ранее сегодня я задал вопрос об экранировании амперсандов в отображаемом HTML-тексте, и теперь я знаю, что вы используете <% = h%>. Из того, что я читал в Интернете, <% = h%> не избежать апострофа. Если я ошибаюсь и <% = h%> действительно избегает апострофов, то я не уверен, как реализовать это с collection_select, потому что я пробовал несколько комбинаций, и ни одна из них не работает.

Вот строка кода, создающая выпадающий список:

<%= season_form.collection_select :variety_id, Variety.find(:all), :id, :name, :prompt => "Optional: Variety" %>

Спасибо!

ОБНОВИТЬ

Вот мой JavaScript. У меня есть иерархия товаров. В качестве объяснения: этот JavaScript позволяет моему пользователю выбрать продукт из раскрывающегося списка, а затем автоматически ограничивает второй раскрывающийся список только теми сортами, которые принадлежат любому продукту, выбранному пользователем. Это прекрасно работает, пока в названиях сортов нет апострофов.

Кроме того, я попытался добавить escape_javascript перед почти всеми элементами, но ни один из них не решил проблему. Документация по Rails для этого помощника не существует, так что примеров нет. Спасибо за вашу помощь!

var varieties = new Array();
<% for variety in @varieties -%>
  varieties.push(new Array(<%= variety.product_id %>, '<%=h variety.name %>', <%= variety.id %>));
<% end -%>

function collectionSelected(e) {
  product_id = e.getValue();
  options = e.next(1).options;
  options.length = 1;
  varieties.each(function(variety) {
    if (variety[0] == product_id) {
      options[options.length] = new Option(variety[1], variety[2]);
    }
  }); 
}
12.10.2009 22:31:19
Добавлен javascript к исходному вопросу в качестве обновления. Смотри выше.
MikeH 13.10.2009 13:40:05
2 ОТВЕТА

Редактировать:

Я только что понял, что вы не должны избегать кода на стороне сервера. Вы должны быть в коде JavaScript. Для функции побега javascript, пожалуйста, смотрите здесь: http://www.w3schools.com/jsref/jsref_escape.asp

Вы должны использовать escape_javascript (), который находится в API здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#M001758

0
13.10.2009 04:00:31

Вы можете использовать gsub и заменить то, что вы хотите.

Я обычно использую помощник выбора и просто передаю это. Я не думаю, что collection_select использует это.

Variety.all.collect{|v| [v.id, v.name.gsub("'", "\'")]}

Для collection_select вы можете «исправить» записи, прежде чем использовать их.

varieties = Variety.all.map{|v| v.name.gsub("'", "\'")}
collection_select(:variety_id, varieties, :id, :name, :prompt => "Optional: Variety")
0
13.10.2009 00:19:42