ruby – 与Faye和Rails的私人消息

我正在使用
the railscast中的
faye gem,允许应用程序推送消息.问题是它将消息推送到所有打开的聊天客户端.我需要他们是私人的.可以通过faye获取私人消息,但它是基于网址的.例如,所有消息都将发送到site.com/foo.但是,在我的模型中,聊天没有特定的网址.因为聊天只是该用户发送给您的邮件集合.

因此,如果您以adam site.com/messages/eve登录,那么您可以与前夕交谈,但前夕则相反. site.com/messages/adam.因此,特定于URL的私人聊天似乎是不可能的.

有什么指针吗?

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);
    });
});

最佳答案 我解决了!问题是我在application.js中有了subscribe函数,这意味着它会在每个页面上运行subscribe 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 
点赞