通知 - 快讯,如何

Notifications - flash message, how to

正在寻找一种方式来通知用户他们已获得新徽章。

我按照此处的说明设置了观察器:https://github.com/merit-gem/merit#getting-notifications

我的观察者代码是:

class ReputationChangeObserver

  def update(changed_data)  
    description = changed_data[:description]
    flash[:info] = description
  end

end

Rails 投诉如下:

undefined local variable or method `flash' for #<ReputationChangeObserver:0x0000000586d648>

我知道 flash 是基本动作控制器的一部分。但是,我不知道观察者如何访问 flash 或 session,因为它似乎存在于 rails 框架之外。

我错过了什么?似乎没有任何关于如何实现用户通知的示例或教程(我能找到)。

请问有没有人可以分享一下他们的智慧?

据我所知,您无法通过观察者访问 flash。您需要一种单独的方式将消息传递给网页上的用户。例如,在 update() 方法中,捕获您想要显示的信息并创建 activity 的记录,您的控制器将使用该记录。您可以设置自己的模型或使用处理 activity 提要的 gem 之一。

根据您的用例,可能有几种不同的通知方式:

  1. 使用类似以下内容的实时通知:http://railscasts.com/episodes/401-actioncontroller-live?view=asciicast(您可以直接在上面的 update() 中发布数据并让订阅者使用它)
  2. 在网页上进行长轮询以提取任何更新:http://railscasts.com/episodes/229-polling-for-changes-revised?view=asciicast
  3. 显示用户页面加载的更新:设置 before_action 过滤器并检查用户是否有新的 activity 供稿。如果是,请将其添加到flash。

如果您知道您的用户会在一个页面上停留一段时间,1,2 将是合适的。例如,如果您的应用程序有仪表板页面或时间线页面(如 FB 或 Twitter)。 如果您知道您的用户将加载(访问)许多不同的页面,但您的用户在重新加载页面之前无法获得更新,则 3 是理想选择。

简而言之,没有办法直接将您的通知推送到观察者中。更新发生在后台,它不知道控制器。您需要存储(或在实时更新的情况下发布)更新,并且当用户加载您的应用程序时,让您的控制器拉取更新以向用户创建通知。

希望这对您有所帮助。