9

Weźmy scenariusz:Jak okresowo pobierać/aktualizować wartość w szynach?

counter 10 seconds 
  • Użytkownik odwiedził show.html.erb stronę
  • show.html.erb pobrać wartość z database korzystając <%= @post.value %>.
  • Uruchomiono licznik i każda iteracja licznika jest dla 10 seconds.
  • Po każdym 10 seconds chciałem zmienić klasę @post.value przy użyciu klasy .
  • zaktualizować @post.value w bazie danych.
  • Odśwież show.html.erb automatycznie i <%= @post.value %> pokaże zaktualizowaną wartość
  • powyższy proces będzie prowadzony w pętli aż do obsługi przejść do innych stron.

Jeśli mam na celu uproszczenie problemu w kodzie wtedy byłoby słuszne:

widoku strony

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

metody kontrolera

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 

klasy Utility

I chcesz zaktualizować post.value na th e podstawie metody napisanej w tej klasie. pseudokod:

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 

Pytania

  • Gdzie mam umieścić licznik? po stronie klienta lub po stronie serwera? Nie chcę używać background jobs w szynach.
  • Jakie zmiany należy wprowadzić w metodzie show, aby po każdym interwale strona odświeżała się automatycznie i przekazywała zaktualizowaną wartość w @post.value?

Dzięki za pomoc!

+0

Myślę, że można uzyskać lepsze odpowiedzi, jeśli można opisać to, co jest w rzeczywistości próbuje zrobić - próbujesz dodać licznik widzenia? Lub podać jakąś formę aktualizacji na żywo? Spróbuj opisać to z punktu widzenia użytkowników. – max

+0

@AmitPal: Pytanie 2 i 3 są mylące, czy myślisz o jednym z nich, czy obu? Jeśli odświeżasz stronę okresowo co 10 sekund, to aktualizacja konkretnej wartości za pomocą ajaxa nie ma sensu. Ponadto nie można zaktualizować wartości '<% = @ post.value%> w widoku, można zaktualizować fragment HTML, w którym ta wartość jest renderowana na stronie. Czy to właśnie próbujesz powiedzieć? czy czegoś brakuje? – Surya

+0

@Surya Tak, myślę, że jeden z nich lub jakiekolwiek podejście, które jest lepsze. Tak, masz rację co do renderowania "HTML". Nie sądzę, że "Ajax" nie zadziała w tym przypadku. Ostatecznie szukam sposobu, dzięki któremu będę mógł okresowo aktualizować 'post.value' (jak na conuntera) przy użyciu podanej metody' utility' class till user odwiedza stronę. Powiedzmy, że pierwsza wizyta: licznik startu i '@ post.value' = 3 zaktualizuje wartość w bazie danych i wyrenderuje nową wartość w widoku HTML po automatycznym odświeżeniu strony Poczekaj 10 sekund i kontynuuj powyższy projekt –

Odpowiedz

1

Powiedziałbym, że najłatwiejszym podejściem byłoby użycie ActionController::Live. Używając go, będziesz mógł wysłać SSE (Server Sent Event) do swojego klienta, mając jednocześnie skrypt js, aby złapać i zaktualizować swój <%= @post.value %>. Oto pretty nice manual na temat korzystania z niego.

Nadal z mojego punktu widzenia najodpowiedniejszym sposobem wdrożenia rzeczy, które chcesz zrobić, będzie użycie czegoś takiego jak Faye. Jest to system przesyłania komunikatów publikowania/subskrypcji, który umożliwia aktualizowanie klienta o nowe dane, gdy tylko się pojawi, np. Można ustawić model after_save i opublikować aktualizację dla wszystkich subskrybowanych klientów. I oczywiście jest klejnot o nazwie faye, aby zawinąć jego użycie.

2

Wybrałbym z Firebase w przeciwieństwie do odpytywania serwera.

Jeśli jednak chcesz okresowo odpytywać serwer, potrzebowałbym metody JavaScript, która wykonywałaby się co 10 sekund lub w dowolnym przedziale czasu, i pobiera wszystkie dane, które chcesz asynchronicznie, a następnie aktualizuje DOM.

Również ruby wrapper for firebase api, w przypadku, które mogą być interesujące