Я добавил функциональность PWA в свое приложение rails 6.0.2.1, также используя devise, следуя этому руководству, с методом контроллера: https://onrails.blog/2019/01/08/easy-pwas-the-rails-way/
Теперь, когда я вхожу с любой пользователь, я перенаправлен непосредственно к самому файлу рабочего сервиса (http://localhost: 3000 / service-worker. js) вместо пути root. Сам файл скопирован из учебника, и я следовал за ним шаг за шагом. Независимо от того, как тяжело я выглядел, я не мог найти причину перенаправления в файл после входа в систему или регистрации.
Обновление: похоже, оно связано с self.find_first_by_auth_conditions, кодом из devise, позволяющим войдите в систему с именем пользователя вместо электронной почты.
Заранее спасибо! Я действительно застрял ...
Вывод файла журнала при входе в систему:
# Service Worker Routes
get '/service-worker.js' => "service_worker#service_worker"
get '/manifest.json' => "service_worker#manifest"
# application.js
if (navigator.serviceWorker) {
navigator.serviceWorker.register('/service-worker.js', { scope: './' })
.then(function(reg) {
console.log('[Companion]', 'Service worker registered!');
console.log(reg);
});
}
# service_worker.js.erb
var CACHE_VERSION = 'v1';
var CACHE_NAME = CACHE_VERSION + ':sw-cache-';
function onInstall(event) {
console.log('[Serviceworker]', "Installing!", event);
event.waitUntil(
caches.open(CACHE_NAME).then(function prefill(cache) {
return cache.addAll([
'<%= asset_pack_path 'application.js' %>',
'<%= asset_pack_path 'application.css' %>',
]);
})
);
}
function onActivate(event) {
console.log('[Serviceworker]', "Activating!", event);
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.filter(function(cacheName) {
// Return true if you want to remove this cache,
// but remember that caches are shared across
// the whole origin
return cacheName.indexOf(CACHE_VERSION) !== 0;
}).map(function(cacheName) {
return caches.delete(cacheName);
})
);
})
);
}
// Borrowed from https://github.com/TalAter/UpUp
function onFetch(event) {
event.respondWith(
// try to return untouched request from network first
fetch(event.request).catch(function() {
// if it fails, try to return request from the cache
return caches.match(event.request).then(function(response) {
if (response) {
return response;
}
// if not found in cache, return default offline content for navigate requests
if (event.request.mode === 'navigate' ||
(event.request.method === 'GET' && event.request.headers.get('accept').includes('text/html'))) {
console.log('[Serviceworker]', "Fetching offline content", event);
return caches.match('/offline.html');
}
})
})
);
}
self.addEventListener('install', onInstall);
self.addEventListener('activate', onActivate);
self.addEventListener('fetch', onFetch);
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions.to_h).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first // row 35 referenced in log file
elsif conditions.has_key?(:username) || conditions.has_key?(:email)
where(conditions.to_h).first
end
end