Личные сообщения с 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