Личные сообщения с Faye и Rails

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

Так что, если вы вошли как Адам 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 %>

метод широковещания (отправка на фэй-сервер)

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 (подписка faye-сервера на /messages/*)

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

1 ответ

Решение

Я решил это! Проблема состояла в том, что у меня была функция подписки в 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 
Другие вопросы по тегам