Я работаю с Rails уже пару лет, но это мой первый опыт работы с AJAX и Javascript. Я провел огромное количество времени, читая различные веб-сайты, пытаясь понять, что куда и что он должен делать.
Я пытаюсь обновить div «refreshme» в edit.html.erb в приложении Rails 4 каждый раз, когда изменяется поле «turn» в таблице «stories». Поэтому я написал функцию setInterval() в story.js для проверки @story.turn и обновления. Я могу заставить его обновляться каждые 10 секунд, но я хочу, чтобы код только проверял значение story.turn каждые 10 секунд и обновлял только в том случае, если значение изменилось.
route.rb (правильно ли это?)
match '/stories/:id/refresh' => "stories#refresh", :as => :story_refresh, via: 'post'
refresh.html.erb (в просмотрах/историях — понятия не имею, что здесь принадлежит)
<div class="pollme" data-story-id="<%[email protected] %>" data-story-turn="<%[email protected] %>" >
<%[email protected] %> // This gets changed based on what other users are editing
</div>
edit.html.erb (просмотры/истории) — show.html.erb красиво обновляется в этом div
<div class="refreshme" data-story-id="<%[email protected] %>" data-story-turn="<%[email protected] %>" >
<%= render 'shared/micropost_form' %>
</div>
история.js
$(document).on("page:change", function() {
var $turn;
$turn = $('.refreshme').data('story-turn');
refreshStories = function(){
$.ajax({
type: "POST",
data: { }, // I'm sure something important goes here to get @story.turn out of the stories table
url: "/stories/"+$('.refreshme').data('story-id')+"/refresh"
}).done(function(result) {
alert('done' );
$turn = ; // Not sure what data{} can return
})
if ($('.refreshme').data('story-turn') != $turn) {
$.ajax({
type: "GET", // helps show.html.erb get refreshed into refreshme div in edit.html.erb
url: "/stories/"+$('.refreshme').data('story-id')
}).done(function(result) {
var $sentence_requests = $('.refreshme');
if ($sentence_requests.length > 0) {
$sentence_requests.html(result);
alert('UPDATED micropost requests ') ;
} else {
}
})
}
};
setInterval(refreshStories, 10000);
});
stories_controller.rb
def refresh
@story = Story.find(params[:id])
respond_to do |format|
format.json { }
format.html { }
end
end
def edit
@story = Story.find(params[:id])
@micropost = @story.microposts.build
respond_to do |format|
format.json { }
format.html { }
end
end
В story.js функция GET выполняется, а функция POST — нет. Я не уверен, что я должен «ОТПРАВИТЬ» (я думал, что «ПОЛУЧАЮ» значение из базы данных, но, похоже, это не так).
Я думаю, что POST - это функция AJAX, мне нужно получить @story.turn из таблицы историй, но я не знаю, как заставить ее что-то делать. Мне также нужен GET для обновления? Я ковырялся в этом коде уже несколько недель, похоже, я уже должен был это понять. Любая помощь будет принята с благодарностью.