1

我正在尝试使用private_pub复制类似于 facebook 的推送通知系统。理想情况下,我想链接它以使用诸如gritter 之类的 gem 显示通知(欢迎其他 gem 建议)

每当调用来自控制器的某个操作时,我想向属于特定 ID 的所有订阅者发送通知。只要您登录,您就会订阅频道,通过将 放入subscribe_to布局中来实现。

在视图中:

<%= subscribe_to "/messages/#{@group_id}" %>

在控制器中

PrivatePub.publish_to("/messages/#{@group_id}", "alert('test')")

这工作得很好,但是我希望有一些比alert作为响应更复杂的东西(例如 grinter 通知),所以改为:

PrivatePub.publish_to("/messages/#{@group_id}", data: @some_data)

按照教程,他们为此使用咖啡脚本。但是,我无法发出简单的警报(可能是由于频道中的 id)

这个问题中,OP 能够使用 js.erb 视图解决这个问题。但我无法让它工作。

免责声明:我的js和coffeescript知识几乎为零。

任何帮助表示赞赏:)


编辑

更多信息:我在控制器中有一个方法,它是公共 API 的一部分,并且需要 POST 请求。如果一切正常,它会发出 JSON 成功响应。除此之外,相同的方法会向特定组的所有用户发送通知。

我实际上已经设法让它工作,把它放在控制器中:

回调方法:

respond_to do |format|
    format.js #-> calls callback.js.erb
    #format.json { render json: {"success" => true}.to_json }
end

并将粗磨的东西放入my_api_controller/callback.js.erb

<% publish_to "/messages/#{@group_id}" do %>
    <%= add_gritter(
    "Nova " + link_to("reserva", reservation_path(@r)) + " de #{@channel} para " + 
    link_to(@hostel_name, hostel_path(@hostel_id)),
    :title => "Nova reserva!",
    :sticky => true,
    :image => :notice
) %>
<% end %>

注意:由于订阅频道是在每个视图中完成的(通过布局),您可以在任何页面/视图上收到通知

我现在的问题是,你可以猜到,JSON 响应。由于我无法呈现两个响应,因此只调用了 js.erb,但从不发送 JSON 响应

4

3 回答 3

1

虽然我对这个宝石没有太多经验,但这里有一些可能会有所帮助:


JS

在客户端,您的 JS 基本上是eventlistenerprivate_pub对象上运行的(当您在页面上包含private_pub/ gritterJS 时定义),您可以使用它来执行其他操作(调用警报、将数据附加到页面等)

看来您的后端正在工作,它只是从您正在苦苦挣扎的服务器接收和处理数据。要解决这个问题,您可以做两件事:1)从控制器操作运行标准 JS 调用application.js或运行 js 文件:


控制器

根据private_pub文档,您应该这样做来创建一个 JS 文件:

#app/controllers/your_controller.rb
def create
    @message = "Hello"

    respond_to do |format| 
        format.html { PrivatePub.publish_to("/messages/#{@group_id}", "alert('test')") }
        format.js #-> calls create.js.erb
    end
end 

#app/views/your_controller/create.js.erb
<% publish_to "/messages/new" do %>
  $("#chat").append("<%= j render(@messages) %>");
<% end %>

浏览器

#app/assets/javascripts/application.js.coffee
PrivatePub.subscribe("/messages/new", (data, channel) ->
      alert data.message.content
于 2014-01-14T10:38:43.223 回答
1

publish_to我可以通过在Privat pub的方法中直接添加 gritter 脚本来实现这一点。

在我的控制器中:

PrivatePub.publish_to 
  "/some/URI/#{entity.id}"
 ,"jQuery.gritter.add({
      image: '#{ActionController::Base.helpers.asset_path('notice.png')}'
    , sticky: true
    ,title:'#{t('some_title')}'
    , text: '#{t('some text'}' 
});"

render json: {"error"=>{"code"=>20,"msg"=>e.message},"success" => false}.to_json

基本上,我能够在不使用 html 响应的情况下发布到 PrivatePub,这使我能够按预期返回 JSON 响应。

于 2015-03-11T15:34:35.657 回答
0

我想,您可以在gon gem 的帮助下解决您的问题,如下所示:

In view

<%= subscribe_to "/messages/#{@group_id}" %>

In controller

gon.group_id = @group_id
PrivatePub.publish_to("/messages/#{@group_id}", message: @message)

In messages.coffee

if gon.group_id
  PrivatePub.subscribe "/messages/#{gon.group_id}", (data, channel) ->
    jQuery.gritter.add
      image: '/assets/notice.png'
      title: 'Notification!'
      text: data.message.content

但是,gon.group_id有时会造成麻烦,因此您需要注意这一点。

所以,我建议使用简单的,我们可以在文件中轻松js.erb访问controller's变量。js.erb

希望能回答你的问题。

于 2015-03-10T10:47:04.963 回答