如何在 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 协会 - 用户(设计)在注册和登录后可以“创建团队”或“加入团队”