【问题标题】:Action Controller Live for different userAction Controller Live 为不同的用户
【发布时间】:2013-11-29 19:48:45
【问题描述】:

我正在体验 Rails 4 的新功能 ActionControllerLive。 我尝试建立一个有许多用户的系统,当有人单击特定链接时会收到通知,例如输入messages#index 控制器。

我的问题是当有人使用messages#index控制器时,所有用户都会收到通知,即使是进入控制器的用户!

我正在搜索解决方案,以便我只能通知特定用户!

在我所有的控件中,我都有@current_user,但我真的不知道我应该如何避免他也收到关于他实际在做什么的通知!

一种可能的解决方案是我在前端使用 jquery 对通知进行排序,但这也意味着您可以监视私有通知。

另一种解决方案是每个用户都有自己的频道,但我不知道这真的很有意义以及我应该如何转置它!

这是我的实际代码:谢谢!

def events
  response.headers["Content-Type"] = "text/event-stream"
  redis = Redis.new
  redis.subscribe('gaga') do |on|
    on.message do |event, data|
      response.stream.write("data: #{data }\n\n")
    end
  end
rescue IOError
  logger.info "Stream closed"
ensure
  response.stream.close
end



  def index
   @message = Message.new
   @departments = Department.all.where.not(id: @current_department.id).last(4)
    $redis = Redis.new
    data = {"user" => @current_user.name}
    $redis.publish "gaga", data.merge('msg' => "#{@current_user.name} entered messages index").to_json
     end

还有:

source = new EventSource('/formular')
source.addEventListener 'gaga', (e) ->
  alert e

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 redis ruby-on-rails-4


    【解决方案1】:

    有这个问题:)

    我们使用private channel解决了这个问题


    ActionController::Live 组件不知道谁在收听它发送的任何内容,因此保持代码高效的最佳方法是发送到依赖于用户的私有频道

    这是我们实时代码中的一个示例。它使用Pusher,也就是websockets,但原理是一样的:

      #app/controllers/controller.rb
      Pusher['private-user-' + current_user.id.to_s].trigger('my_event', {
         message: "Removed"
      })
    
      #app/assets/javascripts/javascript.js
      channel = pusher.subscribe("private-user-#{gon.user_id}")
      channel.bind "my_event", (data) ->
          alert data.message
    

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 2016-12-22
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      相关资源
      最近更新 更多