Dank @ yeuem1vannam Antwort, hier ist die endgültige Code I verwendet, die hilft, den Race-Zustand einer Seite zu vermeiden, die alte Informationen lädt, während die Zeit aktualisiert wird und dann das Javascript, das die Zeit aktualisiert und die neue Zeit erhält, und folglich das Nachladen vermisst.
Der Javascript-Code:
var actionChecker;
function doneChecking() {
clearInterval(actionChecker);
}
function checkLastAction() {
// Get the game ID from the html access span
var dataId = document.getElementById('javascript_data_access');
if (!dataId) return doneChecking();
var initActionTime = dataId.getAttribute('init_last_action_time');
if (!initActionTime) return doneChecking();
dataId = dataId.getAttribute('game_number');
if (!dataId) return doneChecking();
// Get the last action time
var ret = $.getJSON("/get_last_action_time/"+dataId, function (data) {
var lastActionTime = data.last_action_time;
if (!lastActionTime) return doneChecking();
if (lastActionTime>initActionTime) {
location.reload();
}
})
}
window.onload = function() {
// Check every 1 second, shouldn't be too short due to performance
actionChecker = setInterval(checkLastAction, 1000);
}
Die Controller Aktion:
def get_last_action_time
last_time = nil
begin
@game = Game.find_by_id(params[:id])
# Return the timestamp of the last action
last_time = (@game && [email protected]) ? @game.reloadTime.to_i : 0
rescue ActiveRecord::RecordNotFound
last_time = 0
end
# Stop bugging us after 30m, we should have moved on from this page
last_time==0 if (last_time!=0 && (milliseconds - last_time)>30*60*1000)
render json: {last_action_time: last_time}
end
Und dann in der html.erb:
<span id='javascript_data_access' game_number=<%= params[:id] %> init_last_action_time=<%= @game.reloadTime %>></span>
Natürlich müssen Sie reloadTime zu Ihrem Modell hinzufügen und auch endTime, wenn es eine Zeit gibt, in der Sie nicht mehr nach einem erneuten Laden suchen möchten.
Scheint zu funktionieren, bis jetzt, müssen Sie sicherstellen, dass Sie vorsichtig sind, wer verantwortlich für die Einstellung reloadTime ist. Wenn zwei Seiten reloadTime bei jedem Neuladen setzen, bleiben Sie in einem Reload-Loop-Kampf zwischen den beiden Seiten stecken.
Die Verwendung von AJAX ist in diesem Fall am einfachsten.Allerdings ist das 'ActionCable' (WebSocket-Weg) in Rails 5 auch recht einfach zu implementieren. Wenn es möglich ist, sollten Sie es ausprobieren. – yeuem1vannam
Gibt es ein einfaches Beispiel, das dies demonstriert? Alle AJAX-Tutorials, die ich angeschaut habe, verwenden AJAX, so dass die Aktionen eines Clients seine eigene Client-Seite aktualisieren können, ohne die gesamte Seite zu laden. Ich möchte Reloads an * andere * Clients senden. Ich werde die Frage aktualisieren, um dies klarer zu machen. –