如何在 Ruby on Rails 中注册服务工作者?

Posted

技术标签:

【中文标题】如何在 Ruby on Rails 中注册服务工作者?【英文标题】:How can I register a service worker in Ruby on Rails? 【发布时间】:2015-10-01 03:14:48 【问题描述】:

我正在尝试在 Ruby On Rails 中注册一个服务工作者来实现推送通知 GCM。但什么也没有发生。请看我下面的代码:

if ('serviceWorker' in navigator) 
    navigator.serviceWorker.register('/assets/service-worker.js')
    .then(initialiseState);
   else 
    window.Demo.debug.log('Service workers aren\'t supported in this browser.');

这部分工作正常。但是,当我拨打navigator.serviceWorker.ready.then(function(serviceWorkerRegistration) 时,什么都没有发生。

我在搜索引擎上搜索,但几乎没有什么可以帮助我。

谁能帮帮我?

【问题讨论】:

您确定serviceWorker.ready 是ServiceWorker API 的一部分吗?我在docs 中找不到任何对它的引用。 @nicohvi 我正在关注谷歌的教程。请参阅此链接Push Notifications on the Open Web 【参考方案1】:

查看serviceworker-rails gem。

正如 Jeff 提到的,Service Worker 所在的路径必须在“范围内”。此 gem 允许您将根(或任何其他路径)的服务工作者请求代理到 Rails 资产管道中的资源。

例如,如果您的 serviceworker 脚本入口点位于 Rails 项目中的 app/assets/javascripts/nested/directory/serviceworker.js 中,您可以通过一些简单的配置设置将您的应用程序配置为从 /serviceworker.js 渲染脚本:

# config/application.rb
config.serviceworker.routes.draw do
  match "/serviceworker.js" => "nested/directory/serviceworker.js"
end

【讨论】:

【参考方案2】:

在您的情况下,服务工作者脚本 service-worker.js 需要从与注册它的页面相同的目录 URL 路径或子路径中提供。

您正在使用路径/assets/service-worker.js,因此除非注册页面也从/assets/ 提供,否则它将失败。如果您在register() 的末尾加上.catch(function(error) console.warn(error); )(返回Promise,您会看到那里报告的错误。

最简单的做法是确保service-worker.js 与网页位于同一目录,然后调用register('service-worker.js'),它使用同目录相对路径。

【讨论】:

杰夫,更改没有任何反应。我的 JS 文件在同一个文件夹中。你建议我如何构建我的 Rails 项目? 您用来访问当前调用register('/assets/service-worker.js')的页面的 URL 是什么? 杰夫,localhost:3000/users/edit。这个视图有一个代码JS注册了service worker。 对,这就是我的意思。您需要在同一 URL 路径中提供 service-worker.js 代码才能从该页面注册,因此需要从 /users/edit/service-worker.js 提供代码。然后你就可以打电话给register('service-worker.js') 杰夫,我放在公用文件夹中并且工作正常。感谢支持。

以上是关于如何在 Ruby on Rails 中注册服务工作者?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby on Rails 中裁剪图像

Ruby on Rails 中的会话如何工作?

Ruby on rails 协会 - 用户(设计)在注册和登录后可以“创建团队”或“加入团队”

如何使下拉表单在 Ruby On Rails 中工作

Ruby on Rails - 如何在 Rails 方法中使用 HTML 坐标?

在 PHP 中匹配 128 个字符的密码哈希 - 使用 Ruby on Rails 加密