1

寻找一种方法来通过 Flash 消息通知用户他们已获得新徽章。

我按照此处的说明进行了观察员设置: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 框架之外。

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

有人会借他们的智慧吗?

4

1 回答 1

0

据我所知,您无法从观察者那里访问闪存。您需要一种单独的方式将消息传递给网页上的用户。例如,在 update() 方法中,捕获您想要显示的信息并创建将由控制器使用的活动记录。您可以设置自己的模型或使用处理活动源的 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 过滤器并检查用户是否有新的活动提要。如果是,请将其添加到 Flash。

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

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

希望这可以帮助。

于 2016-02-29T20:03:49.470 回答