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')