Rails 2.3.8 - поле выбора вызывает ошибку синтаксического анализа, когда поле содержит более одного параметра

Рассматриваемое приложение использует jQuery для выполнения запросов ajax для заполнения зависимых полей выбора. Мое действие контроллера responses_to: js, а в файле .js.erb у меня есть:

str += '<%= f.select field.name, list, {}, { :class => "list", :multiple => "multiple", :style => "size:8; width:100px;" } %>';

«список» заполняется так:

str += '<% list = @validation_model.lookup([field], @lookup) %>';

Я .append() добавляю это в div. в конце файла шаблона .js.erb. Однако, когда «список» содержит более одного значения, синтаксический анализ шаблона завершается ошибкой. Если он пуст или содержит только одно значение, синтаксический анализ выполнен успешно.

Это баг, с которым я столкнулся, или я что-то не так делаю? Обратите внимание, что это выглядит как ошибка синтаксического анализа, а не ошибка времени выполнения, поэтому я не смог точно определить, в чем проблема ни в Firebug, ни в Safari Dev.

ОБНОВЛЕНИЕ: Вот полный код файла .js.erb. Я заменил переменную «список» встроенной логикой для получения массива.

str = '<% fields_for :mapapps do |f| %>';
<% for tf in @tag.tag_fields.find(:all, :order => :sequence) %>
    <% field = tf.parentfield %>
    <% if [email protected]?(field) %>
        $("#<%= field.name %>").remove();
    <% else %>
        <% next %>
    <% end %>
    str += '<div id="<%= field.name %>" class="floater">';
    str += '<label for="mapapps_<%= field.name %>"><%= field.label %></label>';
    str += '<%= f.select field.name, @validation_model.lookup([field], @lookup), {}, { :class => "list", :multiple => "multiple", :style => "size:8; width:100px;" } %>';
    str += '</div>';
<% end %>
str += '<% end %>'
$("#mfrsdiv").append(str);

person AKWF    schedule 15.03.2011    source источник
comment
Полный код просмотра может быть полезен. Во второй строке кода вы фактически назначаете переменную списка в теге ERb, который ничего не выводит внутри назначения переменной javascript.   -  person fx_    schedule 15.03.2011
comment
Одно ключевое отличие, которое я заметил, заключается в том, что когда в массиве находится несколько значений, Rails помещает возврат каретки после каждого элемента option в select. Может ли это быть причиной ошибки синтаксического анализа?   -  person AKWF    schedule 15.03.2011


Ответы (2)


Я думаю, у вас сложилось впечатление, что элементы eruby могут быть добавлены к строке и будут вычисляться в представлении. На самом деле элементы eruby вычисляются в самом файле .js.erb, а затем добавляются к строке. В вашем коде f должна быть переменной формы из представления. Она не будет иметь значения в файле .js.erb. Если вы действительно хотите добавить этот выбор в форму, вы должны думать о частичном и использовать Ajax.

person rubyprince    schedule 15.03.2011
comment
Но работает, по крайней мере в 2.3.8. Подождите, первое окно работает. Потому что он отображается правильно. Бьюсь об заклад, вы правы, и я собираюсь сбить ошибку на втором поле. - person AKWF; 15.03.2011

У меня работает код. Все, что мне нужно было сделать, это поместить «escape_javascript» вокруг вызова f.select.

str += '<%= escape_javascript(f.select field.name, @validation_model.lookup([field], @lookup), {}, { :class => "list", :multiple => "multiple", :style => "size:8; width:100px;" }) %>';

Следует отметить, что код в моем вопросе выше по-прежнему не будет работать по причинам, упомянутым rubyprince, но сама проблема рендеринга решается с помощью escape_javascript.

person AKWF    schedule 15.03.2011