9

Lassen Sie uns ein Szenario nehmen:Wie kann ich den Wert in Schienen regelmäßig abrufen/aktualisieren?

counter 10 seconds 
  • Benutzer besucht show.html.erb Seite
  • show.html.erb den Wert von database<%= @post.value %> mit holen.
  • Zähler gestartet und jede Iteration des Zählers ist für 10 seconds.
  • Nach jeder 10 seconds Ich wollte die @post.value mit utility Klasse ändern.
  • aktualisieren Sie die @post.value in der Datenbank.
  • die show.html.erb automatisch aktualisieren und <%= @post.value %> wird den aktualisierten Wert
  • Above Prozess zeigen wird, bis der Benutzer bewegen sich zu anderen Seiten im Schleife ausgeführt werden.

Wenn ich das Problem in Code zu vereinfachen haben, dann wäre es dieses mag:

Ansicht Seite

<%= @post.value %> 
<%= @post.name %> 

Controller-Methode

def show 
@post = Post.find(params[:id]) 
end 

def update 
.... #It's empty right now 
end 

def fetching_value_from_PostUpdate(current_value) 
.. # Now I need to update the value in database 
end 

Utility-Klasse

I möchte die post.value auf th aktualisieren e Basis der in dieser Klasse geschriebenen Methode. Pseudo-Code:

class PostUpdate 
@@instance_variable 

def initialize(post_value) 
    @@instance_variable = Marshal.load(Marshal.dump(post_value)) 
end 

    #Method required to calculate the value 
def update_data_in_database 
... 
return data 
end 

Fragen

  • Wo muss ich den Zähler setzen? Client-Seite oder Server-Seite? Ich möchte background jobs nicht in Schienen verwenden.
  • Welche Änderungen muss ich in show Methode vornehmen, so dass nach jeder Intervallseite wird automatisch aktualisiert und übergeben Sie den aktualisierten Wert in @post.value?

Vielen Dank für Ihre Hilfe!

+0

Ich glaube, Sie könnten bessere Antworten bekommen, wenn Sie beschreiben, was Sie ist tatsächlich zu tun versuchen - sind Sie eine Ansicht Zähler hinzufügen wollen? Oder bieten Sie eine Form von Live-Updates an? Versuchen Sie, es vom Standpunkt des Benutzers aus zu beschreiben. – max

+0

@AmitPal: Frage 2 und 3 sind verwirrend, denken Sie an beide oder an beide? Wenn Sie die Seite regelmäßig alle 10 Sekunden aktualisieren, ist das Aktualisieren eines bestimmten Werts mit ajax nicht sinnvoll. Außerdem können Sie den Wert von <% = @ post.value%> 'nicht in der Ansicht aktualisieren. Sie können das HTML-Fragment aktualisieren, wenn dieser Wert auf der Seite gerendert wird. Willst du das sagen? Fehle ich etwas? – Surya

+0

@Surya Ja, ich denke eine von ihnen oder jede Annäherung, die besser ist. Ja, Sie haben Recht bezüglich des 'HTML' Renderings. Ich habe nicht daran gedacht, dass 'Ajax' in diesem Fall nicht funktionieren wird. Letztendlich bin ich auf der Suche nach einem Weg, durch den ich den 'post.value' in regelmäßigen Abständen (nach Conunter) mit der angegebenen' Utility'-Klassenmethode aktualisieren kann, bis der Benutzer die Seite besucht. Sagen wir @ ersten Besuch: Zähler Start und '@ post.value' = 3 den Wert in der Datenbank aktualisieren und den neuen Wert in der HTML-Ansicht nach dem automatischen Aktualisieren der Seite Warten Sie 10 Sekunden und fahren Sie mit dem obigen Verfahren fort –

Antwort

1

Ich würde sagen, der einfachste Ansatz wäre die Verwendung ActionController::Live. Wenn Sie es verwenden, können Sie SSE (Server Sent Event) an Ihren Client senden, während Sie ein js-Skript haben, um Ihre <%= @post.value %> zu erfassen und zu aktualisieren. Hier ist ein pretty nice manual zur Verwendung.

Noch aus meiner Sicht ist die am besten geeignete Art und Weise zu implementieren Dinge, die Sie tun wollen, wird etwas wie Faye verwenden. Es ist ein Publish/Subscribe-Messaging-System, mit dem Sie Ihren Client mit neuen Daten aktualisieren können, sobald er angezeigt wird, z. B. können Sie after_save in Ihrem Modell festlegen und ein Update für alle abonnierten Clients veröffentlichen. Und natürlich gibt es ein Juwel, das auch faye genannt wird, um seine Verwendung zu verpacken.

2

Ich würde mit Firebase im Gegensatz zum Abfragen des Servers gehen.

Wenn Sie jedoch den Server regelmäßig abfragen möchten, habe ich nur eine JavaScript-Methode, die alle 10 Sekunden oder in jedem beliebigen Intervall ausgeführt wird und alle Daten abruft, die Sie asynchron und anschließend möchten aktualisiert das DOM.

Auch ruby wrapper for firebase api, in dem Fall, dass

von Interesse sein können
Verwandte Themen