2014-11-26 3 views
4

Я использую faye gem, помеченный в the railscast, что позволяет приложениям нажимать сообщения. Проблема заключается в том, что он посылает сообщения всем открытым чат-клиентам. Мне нужно, чтобы они были частными. Можно получить личные сообщения с faye, но это основано на URL. Например, все сообщения будут отправлены на номер site.com/foo. Но в моей модели чат не имеет определенного URL-адреса. Поскольку чат - это всего лишь набор сообщений, отправленных вам этим пользователем.Личные сообщения с Faye и Rails

Итак, если вы вошли в систему, так как adam site.com/messages/eve позволит вам разговаривать с кануном, но для кануна это наоборот. site.com/messages/adam. Таким образом, конкретный частный чат, похоже, не может быть и речи.

Любые указатели?

messages_controller.rb (запуск Ajax)

def create 
    @message = Message.new(message_params) 
    @message.save 
end 

create.js.erb (вызов метода широковещательной передачи)

<% broadcast params[:message][:username] do %> 
    $(".text-wrap").append("<%= current_user.name %> <%= @message.body %></div>"); 
<% end %> 

метод вещания (размещения на сервере FAYE)

def broadcast(user, &block) 
    channel = "/messages/#{user}" 
    message = {:channel => channel, :data => capture(&block)} 
    uri = URI.parse("http://localhost:9292/faye") 
    Net::HTTP.post_form(uri, :message => message.to_json) 
end 

application.js (подписка Фей сервера в/сообщений/*)

$(function(){ 
    var faye = new Faye.Client('http://localhost:9292/faye'); 
    var subscription = faye.subscribe('/messages/*', function(message) { 
     eval(message); 
    }); 
}); 

ответ

2

Я решил его! Проблема заключалась в том, что у меня была функция подписки в application.js, означающая, что она будет запускать javascript на каждой странице. Вместо этого я сделал это внизу страницы чата, на которой я подписался на /messages/eve/adam. Это, как я сделал это:

<script> 
    $(function(){ 
    var faye = new Faye.Client('http://localhost:9292/faye'); 
    var subscription = faye.subscribe('/messages/#{current_user.username}/#{@user.username}', function(message) { 
     eval(message); 
    }); 
    }); 
</script> 

Затем в методе вещания я удостоверился, чтобы отправить информацию только в нужном месте.

def broadcast(user, &block) 
    channel = "/messages/#{current_user.username}/#{user}" 
    message = {:channel => channel, :data => capture(&block)} 
    uri = URI.parse("http://localhost:9292/faye") 
    Net::HTTP.post_form(uri, :message => message.to_json) 
end 
Смежные вопросы