2013-03-27 4 views
1

파일 내용이 업데이트되면서 웹 페이지로 스트리밍하는 가장 간단한 방법은 무엇입니까?실시간으로 txt 파일의 내용을 레일에 표시합니다.

현재 스크립트가 실행되는 동안 지속적으로 업데이트되는 파일이 .txt이며 업데이트 된 페이지에 해당 파일을 표시하려고합니다.

이 작업을 수행하는 데 필요한 간단한 보석 또는 기술이 있습니까? 아니면 탁월한 Ruby 접근 방식이 있습니까?

첫 번째 생각은 파일의 diff를 반환하기 위해 일종의 AJAX 요청을 사용하는 것이지만 좋지 않은 접근이라고 생각합니다.

+0

HUMM, 당신은이 .txt 파일에서 웹 페이지 양식 필드 값을 업데이트 하시겠습니까 : 여기

은의 스타일인가? –

+0

양식이 없습니다. 지금은 간단한 div입니다. 그리고 파일이 변경 되더라도 항상 파일의 정보를 포함하고 싶습니다. 추가 정보를 제공 할 수 있는지 알려주세요. – ardavis

+0

오케이! 하지만 당신이 말한 웹 페이지를 업데이트하고 싶습니까? –

답변

2

이 작업을 수행하기 위해 Celluloid's Reel by Tony Arcieri을 사용했습니다.

나는 (이 부분에 Adam Dalton에서 많은 도움을받은) 배경에서 이것을 실행

require 'reel' 

CONNECTIONS = [] 
Reel::Server.supervise("0.0.0.0", 5000) do |connection| 
while request = connection.request 
    case request 
    when Reel::Request 
     puts "Client requested: #{request.method} #{request.url} #{request.body}" 
     CONNECTIONS.each do |c| 
     c << request.body 
     end 
     request.respond :ok, 'YES! YOU GOT IT!' 
    when Reel::WebSocket 
     puts "Client made a WebSocket request to: #{request.url}" 
     CONNECTIONS << request 
     break 
    end 
end 
end 

sleep 

가 그럼 난 후 요청을 보낼 수있는 명령 줄 스크립트를 작성

my_reel.rb 릴 서버에. Writing Ruby Scripts That Respect Pipelines by Jesse Storimer에서 많은 도움을 받았습니다.

~/빈/serve_it_up

다음
#!/usr/bin/env ruby 

require 'httparty' 

ARGF.each_line do |line| 
    output_line = line.chop 
    HTTParty.post 'http://localhost:5000', body: output_line                                 
end 

가 작동하도록, 내 레일 응용 프로그램은 Sidekiq (bundle exec sidekiq)를 사용하고, 출력을 보내는 버튼을 클릭 백그라운드에서 스크립트를 실행 파일로, output.txt. 그래서 강제 꼬리를 실행하고 명령 줄 스크립트에 출력합니다. 그래서 언제 경우 output.txt 그

connection = new WebSocket('ws://localhost:5000') 

connection.onmessage = (event) -> 
    $('#prompt').append(event.data + '<br/>') 
    prompt = document.getElementById('prompt') 
    prompt.scrollTop = prompt.scrollHeight 

: 내 웹 응용 프로그램에서

tail -f output.txt | serve_it_up 

, 나는 웹 소켓 사귀는하고 페이지에 출력을두고 일부 자바 스크립트 (이 경우 커피 스크립트)가 변경하면 tail -f의 출력이 웹 브라우저에 저장됩니다. 나는 또한 #prompt div에 제한된 높이의 스타일을 적용하고, 항상 아래쪽으로 스크롤되도록 유지합니다.

#prompt { 
    font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif; 
    height: 200px; 
    overflow: auto; 
} 
0

Faye 또는 보석 private_pub (Faye 채널을 비공개로 설정)을 사용하여 웹 소켓이나 긴 폴링을 사용하여 클라이언트에 새 데이터를 푸시 할 수 있습니다. Github 페이지와 RailsCast에는 많은 문서가 있습니다.

앱이나 스크립트에서 새 데이터를 구독 한 모든 채널로 푸시하는 서버에 게시 할 수 있습니다.

+0

고마워요. 제가 가지고있는 것처럼 결과를보고 보겠습니다. – ardavis

+0

@ardavis 어떻게 이런 일을 시작 했습니까? – chrisbulmer

관련 문제