Sie können Ajax-Update dafür verwenden. Allerdings möchten Sie dieses Update beim Verlassen der Seite nicht auslösen, da es nicht zuverlässig ist (Nicht sicher, ob das Ausschalten von async
etwas Gutes bringt). Stattdessen sollten Sie Ihr Ajax-Update regelmäßig (alle 10s) abfragen, um den Datensatz zu aktualisieren. Unten ist meine vorgeschlagene Lösung.
VideosController:
def show
video = Video.find(params[:id])
# Assuming Video belongs_to User, User has two fields called started_watching_at and duration
video.user.update_attribute(:started_watching_at, [current_time])
video.user.update_attribute(:watching_duration, 0)
end
# This method is to update user watching time
def touch_duration
video = Video.find(params[:id])
# Calculate time different then convert to duration
duration = [current_time] - [started_watching_at]
video.user.update_attribute(:watching_duration, duration)
respond_to do |format|
format.js { render nothing: true }
end
end
In Ihrem js Datei, möchten Sie im Grunde Update Benutzerdatensatz mit touch_duration
Methode abzufragen. Etwas wie folgt aus:
$(function() {
var time_to_check = 10000;
setInterval(time_to_check, touch_duration);
function touch_duration() {
// Update user
$.ajax({
url: // update url,
method: "PUT"
}, function(data) {
console.log("Successfully update!");
});
}
})
AKTUALISIERT: Ich vergaß zu erwähnen, dass Sie die Ajax-Update innerhalb der Video-Show Seite nur ausführen möchten. Ich schätze, du kannst das leicht lösen.
Hoffe, dass Ihre Frage beantwortet. Prost!
Das sieht wirklich gut aus. Würde dies dazu führen, dass die Zeit weiterhin angezeigt wird, selbst wenn das Video pausiert ist? – Doughtz
Ja, es ist so lange wie du auf der Seite bleibst – kasperite