2011-08-11 3 views
8

레일 애플 리케이션에서 푸시 알림 (채팅 용)에 Faye (랙 어댑터)를 사용했습니다.레일 pub/sub with faye

다른 유스 케이스 (추가 푸시 알림)에 Faye를 사용하고 싶지만 알아낼 수 없습니다.

내 응용 프로그램에서는 배경 작업으로 모델을 만들 수 있으므로 모델을 만들 때 내보기 (색인 작업)를 새로 고침하고 싶습니다.

과 같이 :

응용 프로그램/모델/post.rb

class Post 
    include Mongoid::Document 

    after_create :notify_subscribers 

    private 
    def notify_subscribers 
     Faye::Client.publish("/posts") 
    end 
end 

응용 프로그램/조회/게시물/index.html.erb

<%= subscribe_to(posts_url) do %> 
    uhh what do I do here? ajax call to refresh the whole page?? 
<% end %> 

그래서에서 직접 알림을 게시됩니다 after_create 콜백 좋은 아이디어 그리고 내가 Faye 서버에서 "update"를 구현하는 방법에 대한 메시지를 받았을 때? 서버에서 데이터를 다시로드하기 위해 AJAX 호출 만 수행합니까? 그것은 느린 것 같습니다.

나는 모델에 대한 업데이트와 비슷한 것을 사용하고 싶다. (사용자가 몇 가지 덧글을 추가했거나 작성자가 내용을 변경했다는 말이다.) DB를 항상 쓰레기로 만드는 것은 좋은 계획처럼 보이지 않는다.

답변

5

우선, 예, after_create으로 알림을 게시하는 것이 좋습니다. notify_subscribers 메소드에서 수행해야 할 작업은 클라이언트에 사용할 새 게시물에 대한 모든 관련 정보를 게시하여 은 알림 수신시 다른 불필요한 AJAX 요청을하지 않아야합니다.

그래서, 예를 들어, title 및 게시물의 content은 사용자가 즉시 볼이 생성됩니다 후, 당신은 같은 것을 할 것입니다 관련있는 경우 :에, 다음

def notify_subscribers 
    client = Faye::Client.new('http://localhost:3000/faye') 
    client.publish("/posts/new", { 
    'title' => self.title, 
    'content' => self.content 
    }) 
end 

를 ... 그리고 보기, 아마 jQuery를 사용하여 서버로부터받은 새로운 게시물에 대한 데이터를 사용할 수 있습니다. Rails 코드는 여기에 도움이되지 않습니다. 예 : 당신이 (당신이 jQuery를 사용하고 있고 헤더에 faye.js을 포함 한 가정) 할 것 :

<script type="text/javascript"> 
$(function() { 
    var client = new Faye.Client('http://localhost:3000/faye'); 
    client.subscribe("/posts/new", function(data) { 
    /* do whatever you need with data */ 
    }); 
}); 
</script> 

마지막으로 전송할 어떻게 든 정보가 통지의 일부로 전송하는 데 너무 복잡 경우, 이미보기를 업데이트하기 위해 기존 AJAX 프로세스가있는 경우 게시 ID를 게시하고 subscribe 콜백 함수에 jQuery로 AJAX 호출을 트리거 할 수 있습니다. 비록 필요한 경우에만 이것을 권하고 싶습니다.

+1

어떻게해야합니까? 페이가 config.ru 양식을 사용하기를 거부합니다. 그리고 Post 객체를 만들 때마다 'RuntimeError : eventmachine not initialized : evma_connect_to_server'가 표시됩니다. 뭐가 문제 야? – prikha

+0

@prikha 당신은 그걸 해결할 수 있었습니까? 나는 똑같은 문제를 겪고있다. – Eduardo

+0

@ 에두아르도 예프! 적절한 스택을 사용하기 시작하면 모든 것이 사라집니다. 유니콘 + 씬 그리고 페이를 사용하여 EM을로드합니다. – prikha