Rails 3: Простые обновления страницы AJAXy?
Не могу поверить, что я смотрю четыре часа на эту простую задачу, но у меня есть.
В Rails 2.3 я мог заменить один раздел страницы на этот простой код:
render: update do | page | page.replace_html "div_id",: partial = > "new_content",...
конец
В Rails 3 Райан Бэйтс написал мне все новые функции javascript, переключившись с Prototype (по умолчанию rails) на jQuery и в противном случае не наслаждаясь жизнью. Другие туты не более понятны.
Что мне не хватает? Как мы заменим <div>
в эти дни?
Ответы
Ответ 1
Спасибо, ребята. Официальный ответ, похоже, состоит в том, что, да, команда чувствует себя просто врагом добра и усложняет ситуацию.
Первый ключ - создать файл .js.erb NAMED для метода CALLING ajax update. Поэтому, если индексный метод обрабатывает обновление, поместите исходный javascript в index.js.erb
. Это происходит в папке представлений.
Во-вторых, код, который работал в index.js.erb, был
m = $('list_users');
m.innerHTML = "<%= escape_javascript(render :partial => "reload_users") %>";
Затем, чтобы сделать вызов, добавьте в блок response_to метода контроллера, добавьте:
format.js
Наконец, вызывающий вид имеет:
<%= link_to "Update User List", @reload_users_path, :remote => true %>
Кстати, предположительно все старые страницы, использующие page.replace
, будут работать, если вы установите плагин. Страница загрузки плагинов предполагает, что она сломалась в последних выпусках Rails 3 и не была исправлена. Кроме того, различные блоггеры придут к вам домой и берёза - переключите вас, если вы его используете.
Ответ 2
Весь массив RJS делает javascript встроенным и делает dom очень навязчивым. Кроме того, избегая встроенного javascript, вы можете открыть другие возможные способы оптимизации вашего javascript с помощью сжатия и кеширования этих файлов в браузере. Именно по этой причине RJS выходит из сферы действия с рельсов 3. Немного обойтись с помощью jQuery или Prototype в течение дня, вы должны получить доступ к передачам с помощью такого рода мелочей и помочь проекту в долгосрочной перспективе.
Ответ 3
У вас все еще есть jQuery? Я бы рекомендовал его через Prototype в любой день...
Если он все еще существует, вы можете просто использовать следующее в своем Javascript:
$.get("<%= url_for path/to/partial %>",
function(response) {
$("#div_id").html(response);
});
Это получает частичное через AJAX и просто выгружает его в div с id div_id.
Надеюсь, это поможет!
Ответ 4
Я даже не уверен, что вам нужно сделать вызов AJAX для загрузки этого частичного. Я считаю, что в файле js.erb вызов render (: partial = > object_or_path) просто вернет строку со всем html, который вы можете обернуть в объект jQuery и добавить. Пример:
$('#div_id').html($('<%= render :partial => @object %>'))
Ответ 5
Насколько я знаю, в той же строке, что и выше, вы можете сделать что-то подобное в своем шаблоне:
<%= link_to "Update User List", @reload_users_path, :remote => true %>
И в контроллере сделайте следующее:
respond_to do |format|
format.js {
render :text => "alert('reloaded')"
}
end
Таким образом, вы можете иметь "JS-клиент" на стороне клиента JS так же, как и рендер: обновление, используемое для выполнения. Это эквивалентно выполнению следующего в Rails 2:
render :update do |page|
page << "alert('reloaded')"
end
Есть ли причина, почему этот подход не рекомендуется?
Ответ 6
Попробуйте следующее:
page.call "$('#div_id').html", render(:partial => 'new_content')