Обновите HTML-контент, предоставленный Embedded Ruby, без перезагрузки страницы

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

<li id="thing">
  <% items.each do |i| %>
    <%= render :partial => 'item', :locals => {:i => i} %>
  <% end %>
</li>

Мне было интересно, есть ли способ с помощью jQuery, AJAX или даже просто рельсов (я уверен, что у каждого из них есть реализуемое решение для меня, и меня интересуют все они), чтобы обновить этот список элементов. Причина, по которой я хотел бы иметь возможность сделать это, заключается в том, что в настоящее время я реализовал функциональность, позволяющую создавать «элемент» или обновлять существующий «элемент», опять же, без перезагрузки страницы (форма появляется в определенном контейнере при нажатии кнопки в обоих случаях), и я хотел бы, чтобы после отправки список автоматически обновлялся новой информацией или новым «элементом». Было бы лучше попытаться обновить весь список? Или есть способ добавить вновь созданный/обновленный объект в список частичных (как частичных) клиентских частей?

Я попробовал следующее утверждение, но я не могу избежать ошибки «неопределенный метод» при рендеринге.

$("#activeTab").append("<%= escape_javascript(render :partial => 'item', :locals => {:i => Item.order(:created_at).last}) %>");

Я подумал, что это было бы хорошим решением, потому что после того, как страница была перемещена и возвращена, список будет загружен снова. Это просто добавление к статическому списку, пока вы все еще находитесь на странице.


person Jake Smith    schedule 23.03.2013    source источник
comment
Можете ли вы примерно указать, какой HTML-код получится в результате этого ruby-кода? Кроме того, этот список, форма и логика обработки формы находятся на одной странице?   -  person Peter Herdenborg    schedule 23.03.2013
comment
В этом представлении есть список объектов, связанных с моделью, для которой предназначено это представление, поэтому я частично беру этот элемент из другой модели. Партиал включает в себя загруженное фото или видео, некоторые метрики и т. д. Так что ничего СЛИШКОМ сложного. Форма при нажатии соответствующей кнопки временно заменяет контейнер, содержащий список, и после отправки снова показывает список. Я просто использую методы jQuery .show() и .hide() в обработчиках событий кликов. Форма представляет собой форму рельсов, поэтому я использую синтаксис form_for ... Это дает лучшее представление? Спасибо, что нашли время :)   -  person Jake Smith    schedule 23.03.2013
comment
Извините, но сейчас 3:45 утра, так что моему мозгу все еще недостаточно информации, чтобы полностью представить ситуацию. Насколько я вижу, у нас есть html-страница в браузере и сервер, способный выплевывать html и реагировать на ajax-запросы. Извините, может быть, я как-то слишком мало знаю (на самом деле ничего) о Ruby, чтобы чем-то помочь.   -  person Peter Herdenborg    schedule 23.03.2013
comment
Не беспокойтесь, спасибо уже Питер! Я просто знаю, что встроенный рубин в html-страницы оценивается до того, как страница полностью загрузится, и что, вероятно, потребуется еще один запрос. Я просто надеялся, что смогу получить доступ к вновь созданному объекту, добавив вместо этого другой оператор рендеринга, например: $("#activeTab").append("<%= escape_javascript(render :partial => 'item', :locals => {:i => Item.order(:created_at).last}) %>");, потому что я еще не очень хорошо знаком с AJAX.   -  person Jake Smith    schedule 23.03.2013


Ответы (1)


возьмите все, что вы используете для отправки этого нового элемента (я назвал его submit_button), и используйте jquery для перезагрузки страницы.

$('#submit_button').click(функция() {

          location.reload();

});

добавить в form_for :remote => true

person mano26    schedule 23.03.2013
comment
Буду ли я перезагружать div, немедленно обернутый вокруг каждого цикла? - person Jake Smith; 24.03.2013
comment
Мой последний комментарий был плохо сформулирован: я бы сделал что-то вроде: $(#thing).reload();? - person Jake Smith; 24.03.2013
comment
Эй, так что с этим подходом есть неперехваченная ошибка TypeError. Он говорит, что у объекта нет перезагрузки метода. Какую документацию я должен искать для метода reload()? - person Jake Smith; 24.03.2013
comment
ошибка конкретно говорит следующее: Uncaught TypeError: Object [object Object] has no method 'reload'. Код, который я использовал, был $("#list").reload(). Предполагается ли, что этот метод reload() переоценивает встроенный рубин в каждом цикле с вызовом сервера? Я спрашиваю, потому что знаю, что встроенный рубин вычисляется на стороне сервера. - person Jake Smith; 25.03.2013
comment
$('#submit_button').click(function() { location.reload(); }); часть location.reload перезагрузит страницу после щелчка вверх, поэтому, если у вас есть кнопка отправки, при нажатии этой кнопки вы выполняете location.reload(), поэтому вам нужно захватить форму в первой части - person mano26; 26.03.2013
comment
После использования location.reload() я убедился, что страница перезагрузилась, однако объект больше не создавался! Вот метод: $(".new_browser_tab").on('click', function (e) { e.preventDefault(); $(this).closest('form').attr('target', '_blank').submit(); $("#thingsSelecter").removeClass("active"); $("#thingsTab").show(); $("#newThingFormTab").hide(); $(this).closest(".normal_or_edit").children(".normal_thing").show(); $(this).closest(".edit_thing").hide(); $("#thingsSelecter").addClass("active");location.reload(); }); - person Jake Smith; 26.03.2013
comment
обратитесь к этот вопрос SO, чтобы получить дополнительную информацию об этом. Мне удалось обновить список частей после создания нового объекта. - person Jake Smith; 04.04.2013