Rails 3: Простые обновления AJAXy Page? - PullRequest
13 голосов
/ 25 октября 2010

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

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

render: update do | page | page.replace_html "div_id",: part => "new_content", ... конец

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

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

Ответы [ 6 ]

12 голосов
/ 26 октября 2010

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

Первый ключ - создать файл .js.erb NAMED для метода CALLING ajax update. Поэтому, если метод 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 и не был исправлен. Кроме того, различные блоггеры придут к вам домой и переключат вас, если вы им воспользуетесь.

4 голосов
/ 25 октября 2010

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

1 голос
/ 25 октября 2010

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

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

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

Это получает частичное с помощью AJAX и просто создает дампэто в div с идентификатором div_id.

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

0 голосов
/ 03 апреля 2013

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

<%= 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

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

0 голосов
/ 27 января 2011

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

page.call "$('#div_id').html", render(:partial => 'new_content')
0 голосов
/ 25 октября 2010

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

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