Я установил простое демонстрационное приложение (с пользователями и сообщениями) для тестирования с использованием jQuery, Ajax и Rails вместе. Идея состоит в том, что при наведении указателя мыши на строку пользователя на странице индекса пользователя страница будет использовать Ajax для загрузки первого сообщения этого пользователя. Это функционально «работает», но число серверных GET-запросов на выборку данных удваивается при каждом наведении мыши, пока страница не замедлится до сканирования. Может кто-нибудь помочь мне понять, почему это происходит?
Пользователь index.html.erb, который отображает вывод, выглядит так:
...
<% @users.each do |user| %>
<tr class="user_name" id="<%=user.id %>">
<td><%= user.name %></td>
<td><%= user.email %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, confirm: 'Are you sure?', method: :delete %></td>
</tr>
<% end %>
</table>
<div id="first_message"></div>
...
Мой код Ajax на основе jQuery (в assets / ajax.js) выглядит следующим образом:
$(document).ready(function () {
$('.user_name').mouseover(function() {
var userId = $(this).attr('id');
$('#first_message').load(window.location + userId + "/first_message");
});
});
Я добавил следующий маршрут для обработки загрузки сообщения:
match 'users/:id/first_message' => 'users#first_message'
Контроллер для обработки запроса выглядит так:
class UsersController < ApplicationController
def first_message
@user = User.find(params[:id])
respond_to do |format|
format.html # first_message.html.erb
end
end
Наконец, страница ответа html (first_message.html.erb) для запроса Ajax выглядит следующим образом:
<h3> <%= @user.name %>'s first message: </h3>
<% if @user.messages.length > 0 %>
<%= @user.messages[0].content %>
<% else %>
...
<% end %>
Есть мысли?