Я пытаюсь создать поток сообщений AJAX в моем приложении на Rails 3, используя jQuery. Приложение показывает сообщения и ответы на пост. Сейчас пользователю требуется обновить браузер для обновления:
//in app/views/posts/_replies.html.erb
<div class="replies">
<% for reply in @replies %>
<div class="reply">
<p><%= reply.body %></p>
</div>
<% end %>
</div>
Я пытаюсь использовать порт jQuery PeriodicalUpdater (https://github.com/RobertFischer/JQuery-PeriodicalUpdater/), чтобы адаптировать ответы как постоянно обновляемый поток.
Основано на Railscast Райана Бейтса (http://railscasts.com/episodes/136-jquery), вот что у меня есть:
// in public/javascripts/application.js
$(document).ready(function(){
$.PeriodicalUpdater('/replies', {
method: 'post',
data: ???,
minTimeout: 1000,
maxTimeout: 8000,
multiplier: 2,
type: 'json',
maxCalls: 0,
autoStop: 0
}, function(data) {
????
});
});
Я новичок в js и jQuery, поэтому мне не совсем понятно, как передать текущее сообщение на сервер и как сделать так, чтобы оно автоматически отображало replies
. Вот остаток моего кода:
// in app/views/posts/show.js.erb
$("#replies").append("<%= escape_javascript(render 'replies') %>");
// app/controllers/posts_controller.rb
class PostsController < ApplicationController
def replies
@replies = Post.find(params[:id]).replies
respond_to do |format|
format.js
end
end
end
Есть ли способ передать идентификатор текущего post
в контроллер? Может быть, даже передать идентификатор последнего reply
, чтобы сервер отправлял только новые ответы?
Кроме того, мне нужно вручную добавлять все внутри функции обратного вызова PeriodicalUpdater? Или есть способ сделать частичную show
для обновлений?
Обновление : мне понравился @Spencer, предложенный ниже, заменив его на первую кнопку, которую вы нажимаете для обновления AJAX.
У меня проблемы с передачей этого параметра. Мой реальный код ищет вещи на основе уникального URL-ключа, поэтому у меня просто есть:
<input type="button" value="Refresh" onclick="getReplies('<%= @post.url_key %>');" />
Тогда в моем файле application.js:
function getReplies(url_key) {
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "/replies",
data: { url_key: url_key },
success: function(msg) {
$.each(msg.Replies, function(index, reply) {
$("#replies").prepend('<p>' + reply.body + '</p>')
});
}
});
}
В моем контроллере у меня есть:
def replies
@post = Post.find_by_url_key(params[:url_key])
respond_to do |format|
format.json { render :json => @post.replies }
end
end
Я получаю:
Processing by PostsController#replies as JSON
Parameters: {"_json"=>"url_key=some-post"}
←[1m←[35mPost Load (1.0ms)←[0m SELECT `posts`.* FROM `posts` WHERE (`posts`.`url_key` IS NULL) LIMIT 1
Похоже, что параметр не извлекается из params
.