Rails 2.3.8 - поле выбора, вызывающее ошибку разбора, когда поле содержит более одной опции - PullRequest
0 голосов
/ 15 марта 2011

Рассматриваемое приложение использует jQuery для выполнения запросов ajax, чтобы заполнить зависимые поля выбора. Действие моего контроллера Responds_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. Я заменил переменную list на встроенную логику, чтобы получить массив.

str = '<% fields_for :mapapps do |f| %>';
<% for tf in @tag.tag_fields.find(:all, :order => :sequence) %>
    <% field = tf.parentfield %>
    <% if !@lookup.include?(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);

Ответы [ 2 ]

1 голос
/ 15 марта 2011

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

0 голосов
/ 15 марта 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.

...