如何在通知页面的链接上创建+1

时间:2014-07-05 09:46:41

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

我创建了一个页面,允许公司应用查看用户 回答

如果用户已创建应用程序,并且用户已对其进行了应答,则该应用程序将显示在该页面上。显示他们的答案,谁回答,以及他们回答的时间。

我想要做的是在此页面的链接上添加通知系统,以便公司可以知道新用户何时应答了他们的应用程序,而无需访问/访问该页面。

页面很简单。

companies_controller:

def applicants
 @applications = current_company.applications.order("created_at DESC")
end

applicants.html.erb:

<% @applications.all.each do |application| %>
<% application.answers.each do |answer| %>

  <p>Your question1: <%= answer.application.question_1 %></p>
  <p>Their answer 1: <%= answer.answer_1 %></p>
  <p>Your question 2: <%= answer.application.question_2 %></p>
  <p>Their answer 3: <%= answer.answer_2 %></p>
  <p>Your question 3: <%= answer.application.question_3 %></p>
  <p>Their answer 3: <%= answer.answer_3 %></p>


  <i>Answered by <b><%= link_to "#{answer.user.fullname}", user_path(answer.user.slug) %></b>, <%= time_ago_in_words(answer.created_at) %> ago</i> | <%= button_to "delete this applicant", root_url, data: { confirm: "Are you sure?"}, method: :delete %>
  <hr>

<% end %>
<% end %>

每家公司在登录后都可以通过标题中的导航访问申请人页面。理想情况下,我希望旁边有一个计数器(1,2,3)。取决于已应用的新用户数量。我该如何创建呢?

1 个答案:

答案 0 :(得分:1)

<强>活

根据我的理解(你想要一个无状态的功能,在通知后更新通知)?

如果有,我建议您查看websockets / live功能。这基本上允许您在应用程序以特定方式执行操作时显示不同的触发器。 IE您要使用push notifications或类似的


<强> JS

有很多方法可以实现这一点,所有方法都使用相同的模式 - 在前端使用JS来&#34; listen&#34; 来获取服务器的任何更新。< / p>

然后,服务器将异步发送更新(使用websocketsSSE或类似的内容)。一条消息已被发送,JS&#34;听众&#34;将基本上&#34;赶上&#34;消息&amp;以下是处理它的功能。

一个很好的例子是here

source = new EventSource('your/endpoint');
source.addEventListener('message', function(e) {
  console.log(e.data);
}, false);

这是使用Rails中的ActionController::Live功能覆盖的,但目前第三方处理得更好(悲伤却是真的)

-

<强>事件

有几件事你可以看:

<强> SSE's (Server Sent Events)

服务器发送事件是HTML5功能,基本上允许您将异步消息从服务器发送到前端:

  

服务器发送的事件是指网页自动从中获取更新   服务器。

     

之前也可以这样做,但网页必须询问是否   任何更新都可用。通过服务器发送的事件,更新到来   自动。

     

示例:Facebook / Twitter更新,股票价格更新,新闻源,   运动成绩等。

这不是通过Ajax - 它通过HTTP与JS,并使用text/event-stream标头处理。你可以像这样处理它:

#config/routes.rb
resources :your_controller do
    collection do
       get :messages #-> domain.com/your_controller/messages
    end
end

如果你将JS设置为&#34; listen&#34;到那个网址,你就能够“抓住”#34;您从服务器发送的任何信息,如下所示:

class MyController < ActionController::Base
  include ActionController::Live

  def message
    response.headers['Content-Type'] = 'text/event-stream'
    sse = SSE.new(response.stream, retry: 300, event: "event-name")
    sse.write({ name: 'John'})
    sse.write({ name: 'John'}, id: 10)
    sse.write({ name: 'John'}, id: 10, event: "other-event")
    sse.write({ name: 'John'}, id: 10, event: "other-event", retry: 500)
  ensure
    sse.close
  end
end

这将允许您使用这样的JavaScript:

var source = new EventSource("/your_controller/messages");
source.onmessage = function(event) {
    alert ("message");
};

-

Websockets

虽然SSE路线是&#34;本地&#34;对于HTML5(IE除外),它基本上是Ajax Long-Polling的美化版本,基本上意味着您的浏览器将每秒ping您的服务器以进行更新。 LAME

更强大的方法是使用websockets,这实际上会在您的浏览器和浏览器之间建立永久连接。服务器。虽然我们还没有在Rails中使用本地工作,但我们已经找到了一个可以处理它的Pusher系统

Pusher是一个基本上通过服务器创建websocket的插件。这意味着您可以包含他们的gem,允许您与前端交谈(以类似于Redis的方式):

#app/controllers/my_controller.rb
Class MyController < ApplicationController
   def your_action
      Pusher.trigger('my-channel', 'my-event', {
          message: 'hello world'
      });
   end
end

#app/assets/javascripts/application.js
var channel = pusher.subscribe('my-channel');
channel.bind('my-event', function(data) {
  alert('Received my-event with message: ' + data.message);
});