Rails 3: простые обновления страницы AJAXy?

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

В Rails 2.3 я мог заменить один раздел страницы таким простым кодом:

визуализировать :обновить сделать |страница| page.replace_html "div_id", :partial => "new_content",... конец

В Rails 3 Райан Бейтс заставляет меня писать совершенно новые функции javascript, переключаться с Prototype (по умолчанию в Rails) на jQuery и в остальном не радоваться жизни. Другие туты не более прямолинейны.

Что мне не хватает? Как мы заменяем <div> в наши дни?


person Ed Jones    schedule 25.10.2010    source источник


Ответы (6)


Спасибо, парни. Официальный ответ, похоже, таков: да, команда посчитала, что простота — враг добра, и усложнила ее.

Первый ключ — создать файл .js.erb NAMED для метода, ВЫЗЫВАЮЩЕГО обновление ajax. Поэтому, если метод index обрабатывает обновление, поместите необработанный 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 и не был исправлен. Кроме того, различные блоггеры будут приходить к вам домой и переключать вас, если вы его используете.

person Ed Jones    schedule 26.10.2010
comment
Я не уверен, почему некоторые разработчики рельсов думают, что .replace_html является встроенным javascript. Это RPC (удаленный вызов процедуры) — надежный шаблон проектирования. Им просто нужно скрыть бэкэнд службы обмена сообщениями клиент/сервер RPC и сделать библиотеку API на стороне клиента независимой. - person Greg; 14.10.2012

Весь этот материал RJS делает JavaScript встроенным и делает дом очень навязчивым. Кроме того, избегая встроенного javascript, вы можете открыть другие возможные способы оптимизации вашего javascript путем сжатия и кеширования этих файлов в браузере. Это причина, по которой RJS выходит за рамки рельсов 3. Небольшое знакомство с jQuery или Prototype в течение дня должно помочь вам разобраться с такими мелочами и поможет проекту в долгосрочной перспективе.

person Kunday    schedule 25.10.2010

У вас все еще есть jQuery? Я бы порекомендовал его вместо Prototype в любой день...

Если он все еще там, вы можете просто использовать следующее в своем Javascript:

$.get("<%= url_for path/to/partial %>",
      function(response) {
        $("#div_id").html(response);
      });

Это получает партиал через AJAX и просто выгружает его в div с идентификатором div_id.

Надеюсь это поможет!

person robbrit    schedule 25.10.2010
comment
Нет, пока просто пытаюсь обновиться до Rails 3, не желая сегодня изучать jQuery. :-) page.replace_html показался достаточно простым и эффективным. - person Ed Jones; 25.10.2010
comment
Чёрт, ну ладно! К сожалению, я так долго не использовал RJS или Prototype, что забыл, как их использовать! - person robbrit; 26.10.2010

Я даже не уверен, что вам нужно сделать вызов AJAX, чтобы загрузить этот фрагмент. Я считаю, что в файле js.erb вызов render(:partial => object_or_path) просто вернет строку со всем html, который вы можете обернуть в объект jQuery и добавить. Пример:

$('#div_id').html($('<%= render :partial => @object %>'))
person Samo    schedule 25.10.2010

Насколько я знаю, в той же строке, что и ответ выше, вы можете сделать что-то подобное в своем шаблоне:

<%= link_to "Update User List", @reload_users_path, :remote => true %>

И в контроллере сделайте так:

respond_to do |format|
  format.js {
    render :text => "alert('reloaded')"
  }
end

Таким образом, вы можете заставить контроллер «выполнять» JS на стороне клиента так же, как это делал render:update. Это эквивалентно следующим действиям в Rails 2:

render :update do |page|
   page << "alert('reloaded')"
end

Есть ли причина, по которой этот подход не рекомендуется?

person Eric    schedule 03.04.2013

Попробуй это:

page.call "$('#div_id').html", render(:partial => 'new_content')
person Che    schedule 26.01.2011