我正在使用
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