Reload automático a cada 10 segundos

1,338 views
Skip to first unread message

eltin182

unread,
Aug 13, 2014, 8:01:29 AM8/13/14
to rail...@googlegroups.com
Fala galera blz? Seguinte, é simples, tenho uma index.html.haml e queria que ela ficasse recarregando a cada 10 segundos sem precisar ficar apertando f5.
Podem me da uma força? :D
Nem que seja um link pra eu v como resolve... > . <
Abraço!

Douglas Matoso

unread,
Aug 13, 2014, 8:08:23 AM8/13/14
to rail...@googlegroups.com
A maneira mais simples é adicionar no head da página:

<meta http-equiv="refresh" content="10" />


Douglas Matoso
www.dmatoso.com



--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo quot;rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Everaldo Gomes

unread,
Aug 13, 2014, 8:10:58 AM8/13/14
to rail...@googlegroups.com
Dá pra usar um setTimeout, com Javascript...


Só trocar 5000 por 10000.

Ah, é código javascript, tem que colocar as tags etc.


2014-08-13 9:01 GMT-03:00 eltin182 <elton.me...@gmail.com>:
--

eltin182

unread,
Aug 13, 2014, 8:58:46 AM8/13/14
to rail...@googlegroups.com
Hummm... vlwww caras!
Tipo, e se for somente em um canto específico do meu código? Por exemplo, dentro de uma tabela(que coloquei um id de #reload-table) ou do .container-fluid?
É pq eu to fazendo o seguinte:
Eu coloquei um label no topo da página com o id #page-loading que enquanto a página não for totalmente carregada ele aparece lá o nome "Carregando..."
Daí eu ia usar esse label em conjunto com o reload da tabela.. dai eu pus o codigo do label carregando assim:

$(document).on('page:fetch', function() {
    $('#page-loading').toggle();
});

Enquanto a tabela carrega, ia ficar mostrando o label... so pra orientar o usuário msm...

Everaldo Gomes

unread,
Aug 13, 2014, 9:27:54 AM8/13/14
to rail...@googlegroups.com
Aí é um pouco mais complicado....

Esqueci o termo. Acho que pooling é uma das técnicas, mas deu branco...


--

Douglas Camata

unread,
Aug 13, 2014, 9:33:01 AM8/13/14
to rail...@googlegroups.com
Ai é um setTimeout com AJAX, eu creio.
--
Douglas Camata
Graduando em Ciência da Computação (UENF)

Skype: douglas_camata
-----------------------------------
Linux User #509211

Everaldo Gomes

unread,
Aug 13, 2014, 10:45:32 AM8/13/14
to rail...@googlegroups.com
Talvez dê pra usar Websockets...sei lá.

Alex Takitani

unread,
Aug 13, 2014, 12:11:55 PM8/13/14
to rail...@googlegroups.com
+1 pra:  Ai é um setTimeout com AJAX

eltin182

unread,
Aug 13, 2014, 12:33:53 PM8/13/14
to rail...@googlegroups.com
Mermao q tenso, to tentando buscar na web alguma função que ja tenha isso, pra eu pegar e usar =X
Pensando em fazer com o setTimeout msm

setTimeout(function(){
   window.location.reload(1);
}, 5000);

Tipo, nao era pra ser dificil, se tenho uma tabela chamada #reloader-table
Tenho que fazer uma chamada ajax pra carregar somente ela. Eu to pensando aki ainda. É pq isso aki:
%meta{'http-equiv' => 'refresh', :content => "15"}
Não vai funcionar cmg, pq somente a tabela precisa ser atualizada, as demais coisas não.

Junior Mesquita Dandao

unread,
Aug 13, 2014, 12:45:29 PM8/13/14
to rail...@googlegroups.com
eltin182. 
vc pode usar ajax com timeout. Na resposta do ajax vc:

traz toda a pagina, copia a tabela e subtitue pela do browser. 
ou cria uma ação somente p\ essa tabela, faz um ajax e substitue a tabela.
ou cria uma ação somente p\ os dados dessa tabela, faz um ajax e substitue os dados. 
Nos dois ultimos casos vc poderia usar a gem wice_grid: https://github.com/leikind/wice_grid


--

Alex Takitani

unread,
Aug 13, 2014, 12:51:49 PM8/13/14
to rail...@googlegroups.com

eltin182

unread,
Aug 14, 2014, 3:30:34 PM8/14/14
to rail...@googlegroups.com
Ainda não consegui o que queria :'(
Eu estou com problemas em fazer com minha minha tabela fique no reload a cada 10 segundos...
To tentando viajar nos codigos aki e nada :/

setInterval(function(){
  $.get("/", function(data){
    $("#reload-table").html(data);
  },
  "html")
}, 10000);

Eu nao preciso recarregar a pagina toda, somente preciso recarregar a tabela de instante em instante para visualizar as mudanças la do BD... :'(
To tento dificuldades, pois nunca fiz nada parecido, dai to meio lascado, rsrsrs
Abraço!!

Oseias Ferreira

unread,
Aug 14, 2014, 4:42:09 PM8/14/14
to rail...@googlegroups.com
Tá um pouco difícil te ajudar.
Você não postou o código do lado do servidor.

tenta usar ajax:

setInterval(function(){
$.ajax({
url: "/seu_controller",
dataType: "js",
type: "GET",
}).done(function(data) {
console.log(data);
});
},10000);


O seu controller precisa responder para javascript.

def index
bla-bla-bla
respond_to do |format|
format.html #se você usa
format.js
end
end

Você também precisa da view:

app/views/seu_controller/index.js.erb

(function() {
alert("I'm from index view");
$("#reload-table").html("<%= escape_javascript render(:partial => 'seu_partial_para_table', :locals => { :table => @table }) %>");
});

--
Oseias Ferreira.

eltin182

unread,
Aug 18, 2014, 1:45:31 PM8/18/14
to rail...@googlegroups.com
Fala galera, blz!

Oseias, brigadooo demais pelo q vc mandou, eu fiquei muito feliz! Desculpa ta sendo muito noob, é pq to perdido, pois nunca fiz isso no rails e fico sem nem saber o que fazer. Tipo, eu tenho um controller, registros_controller.rb, que eh utilizado na propria index. Esse controller tem uma tabela q lista varias coisas pegas do banco q preciso atualizar automatico em 10 em 10s.
Daí o meu controller so tem isso:

  def index
  @registros = Registro.all.order("output DESC")
  respond_to do |format| 
           format.html 
           format.js 
        end 
  end

No application.js eu dexei assim:

setInterval(function(){ 
  $.ajax({ 
    url: "/", 
    dataType: "js", 
    type: "GET", 
    }).done(function(data) { 
      console.log(data); 
    }); 
},10000); 


A url eu apontei pra / mesmo, pois é justamente a pagina que eu quero que fique atualizando.

Dai a minha view é essa (index.html.haml):

%table.table.table-striped.table-condensed.table-hover#reload-table
  %tr
    %th Sistema / Serviço
    %th Nome do sistema
    %th Status

  - @registros.each do |registro|
    %tr
      %td= registro.alias
      %td= registro.nome_host
      %td
        - case registro.output
        - when "Funcionando"
          %span.label.label-success
            = registro.output
        - when "Parado"
          %span.label.label-danger
            = registro.output
        - else
          %span.label.label-Warning
            = registro.output

E a outra view eu pus (index.js.haml):

(function() { 
alert("Teste aki"); 
$("#reload-table").html("<%= escape_javascript render(:partial => '/', :locals => { :table => @table }) %>"); 
});  

Mas ainda não deu sinal nenhum... tipo, o javascript nao deve ter sido renderizado D:
O que eh pra ser feito a mais? Eu nao sei o que é esse partial, primeira vez q vi, vou da uma lida agora sobre isso. Abração galera e obrigado!!

eltin182

unread,
Aug 18, 2014, 2:21:34 PM8/18/14
to rail...@googlegroups.com
Ops, correção, na index.js.haml o codigo é:

$("#reload-table").html("#{escape_javascript render(:partial => '/', :locals => { :table => @table })}"); 

Renato Ramiro

unread,
Aug 18, 2014, 2:29:06 PM8/18/14
to rail...@googlegroups.com
Dá pra usar websockets, não? Sempre que tiver alguma inserção, atualização ou deleção, é só vc atualizar a sua tabela. Dá uma olhada nesse tutorial: http://vysakh0.github.io/websockets-in-rails4/


--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo quot;rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Renato Ramiro
Ruby on Rails Developer && Nodejs Newbie

Douglas Camata

unread,
Aug 18, 2014, 2:30:52 PM8/18/14
to rail...@googlegroups.com
setInterval(function(){
  $.ajax({
    url: "/",
    dataType: "js",
    type: "GET",
    }).done(function(data) {
      console.log(data);
    });
},10000);

Este trecho de código deve ser uma requisição AJAX para o seu controller, então, corrigindo: 

1. Dê um jeito de colocar esse Javascript somente na página que usa-o. Creio que colocar esse setInterval no application.js, rodando em todas as páginas, vai ser um pouco ruim

2. Use este código como base para montar a request, processado com erb: 

setInterval(function(){ 
  $.ajax({ 
    url: "<%= registros_url %>", 

    type: "GET", 
    }).done(function(data) { 
      console.log(data)
    }); 
},10000); 

Agora, atente para algo importante: data é o corpo da resposta do seu controller. Neste caso, data será o resultado do seu index.js.haml, após ser processado pelo haml, ou seja: um script js. Você ainda precisa fazer esse Javascript rodar. Eu, pessoalmente, faria isso retornar um HTML e deixaria a substituição do HTML para ser feita ali no código dentro do setInterval e não no js gerado pelo controller.


--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo quot;rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--

Aislan de Sousa Maia

unread,
Aug 18, 2014, 3:08:26 PM8/18/14
to rail...@googlegroups.com
eltin182, recomendo vc seguir o vídeo que o Alex Takitani postou mais acima. 

Oseias Ferreira

unread,
Aug 18, 2014, 3:53:36 PM8/18/14
to rail...@googlegroups.com
O cara não está conseguindo uma requisição javascript e a galera sugerindo websocket…

Eu coloquei aqui um código que funciona da forma que você quer…

https://gist.github.com/oferreiro/0445bb6486f7609999a7

Veja que no helper render você precisa passar o nome do arquivo partial para renderizar e não a url.

Ex:
render "table"

renderiza o arquivo _table.haml.haml que está no mesmo diretório que o arquivo que chama o render.

supondo que você queira passar alguma variável local que será usada no partial é só especificar:

- @registers.each do |r|
= render "row", register: r

Se você só vai usar variáveis globais, que você instanciou no controller não precisa passar nada pro partial.

--
Oseias Ferreira.

eltin182

unread,
Aug 19, 2014, 8:26:29 AM8/19/14
to rail...@googlegroups.com
Booom dia Oseias, Rapaaaaz, eu fiz aki oh, segui o exemplo que vc passou:


Mas ta dando um erro bastante conhecido que eh esse:

undefined method `each' for nil:NilClass

Porém, não tem como não ter valores, pois a tabela que estou buscando lá do banco tem vários registros... não era pra ta como vazia :/
Tem q da certo, saporra > . <
To na reta final, deve ser so algum detalhe, neh possivel. Brigadaoo msm pela ajuda caras, vcs tao me ajudando bastante, juro que não conseguiria sair nem do canto sem vcs!
Abração!


Em quarta-feira, 13 de agosto de 2014 09h01min29s UTC-3, eltin182 escreveu:

Douglas Camata

unread,
Aug 19, 2014, 8:40:37 AM8/19/14
to rail...@googlegroups.com
Amigo, somente este código:

jQuery ->
setInterval(->
console.log "Getting table..."
$.ajax(
url: "/"
dataType: "script"
type: "GET"
).done (data) ->
console.log data
,3000)

Faz exatamente nada com o retorno do seu controller. Você está fazendo uma AJAX pra um servidor, que te responderá com um Javascript e você está simplesmente logando esse Javascript, somente isso. Você ainda precisa colocar esse Javascript para rodar no contexto da view pra poder atualizar a sua div. 

Mas creio que esse erro não seja disso. Exatamente qual linha está gerando isso?


--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo quot;rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+u...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--

eltin182

unread,
Aug 19, 2014, 9:23:58 AM8/19/14
to rail...@googlegroups.com
Nessa linha:

- @registros.each do |registro|


Em quarta-feira, 13 de agosto de 2014 09h01min29s UTC-3, eltin182 escreveu:

eltin182

unread,
Aug 19, 2014, 10:10:27 AM8/19/14
to rail...@googlegroups.com
Deu certo Oo, eh q eu esqueci de colocar no controller a consulta @registros = Registro.all.order("output DESC")
=X
Só não deu certo ainda o CARREGANDO pra mostrar que a tabela está sendo atualizada D:
Vixeeee doidoooo, ta ficando massa *_*
Vlwww galera!

Oseias Ferreira

unread,
Aug 19, 2014, 11:36:59 AM8/19/14
to rail...@googlegroups.com
Mas isto aí você consegue numa lista de jquery…

--
Oseias Ferreira.

Oseias Ferreira

unread,
Aug 19, 2014, 11:42:23 AM8/19/14
to rail...@googlegroups.com
Veja que para tabelas você pode usar algum plugin javascript e pegar o json ao invés de todo html dentro do javascript.
Existem vários plugins que te ajudarão nesta tarefa (datatables, backgrid etc).

Outra coisa é pegar os dados no servidor somente quando houver alterações nos dados.
Se precisar de atualização em "tempo real', usar websockets, como sugeriu o Renato.
--
Oseias Ferreira.

eltin182

unread,
Aug 19, 2014, 12:46:24 PM8/19/14
to rail...@googlegroups.com
Eu gostei dessa ideia ai de somente recarregar a página se houver alteração nas tabelas, pra mim é muito melhor do q a cada 10 segundos, porém deve ser f*** pra implementar =X
Outra coisa, penso em estudar esse datatable do jquery pra usar nesse sistema. Preciso ver as reais vantagens.
Vou tentar alguma coisa e jaja posto aki de novo. Vlwwwww galera!! :DDDD


Em quarta-feira, 13 de agosto de 2014 09h01min29s UTC-3, eltin182 escreveu:

Fábio Carvalho

unread,
Aug 20, 2014, 5:05:14 PM8/20/14
to Rails-br
Mais um dedo na prosa ...

Não é muito oneroso carregar todos os registros da tabela ? (com essa frequência)

@registros = Registro.all.order("output DESC")

 Não seria melhor repensar na massa de dados a ser carregada ?

Um abraço.

Fábio Carvalho


--
Reply all
Reply to author
Forward
0 new messages