2016-07-10 15 views
0

Ich habe eine Website, auf der Benutzer ein Übungsvideo über den eingebetteten JW Player anzeigen können. Ich möchte gerne die Zeit, die sie mit dem Video verbrachten, ihrem Benutzermodell hinzufügen. Ich habe bereits das Datenbank-Setup, aber ich weiß nicht, wie ich die Zeit, die ich meinem Benutzermodell angeschaut habe, hinzufügen kann.Bearbeiten des Modells nach Verlassen der Seite

Wenn ein Benutzer beispielsweise 3 Minuten des Videos ansieht, möchte ich das im User-Modell speichern können. Wie kann ich eine Methode aufrufen, wenn ich die Seite verlasse, sodass ich die Zeit, in der sie das Video angesehen haben, ihrem Benutzerkonto hinzufügen kann?

Antwort

1

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!

+0

Das sieht wirklich gut aus. Würde dies dazu führen, dass die Zeit weiterhin angezeigt wird, selbst wenn das Video pausiert ist? – Doughtz

+0

Ja, es ist so lange wie du auf der Seite bleibst – kasperite

0

Ich zweite was @kasperite sagte. Eine andere Sache, die Sie tun können, um eine feinere Kontrolle über die Position zu erhalten, ist localStorage zu verwenden, um die Position zu speichern.

Verwandte Themen