Процесс OmniAuth обеспечивает следующие функциональные возможности при вызове URL-адреса /auth/:provider
:
- Передать запрос в основное приложение Rack / Rails, как будто OmniAuth там не было;
- Определите, генерирует ли базовое приложение 404;
- Если это так, вызовите актуальную функциональность OmniAuth.
Поскольку вы, по сути, сопоставляете все , используя глобальные маршруты, ваше приложение никогда не выдаст 404, и OmniAuth не сможет выполнить свою работу. Я вижу два немедленных варианта.
Совпадение маршрутов OmniAuth с 404 вручную
Добавить новый маршрут следующим образом:
match '/auth/:provider' => 'omniauth#passthru'
Затем создайте контроллер и действие, которое генерирует 404:
class OmniauthController < ApplicationController
def passthru
render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
end
end
Определение статуса 404 в глобальном маршруте
Я предполагаю, что ваш глобальный маршрут будет каким-то образом искать запись, соответствующую URL; Вы можете промахнуться (например, когда PostsController#index
не может найти сообщение) и сгенерировать 404.
class PostsController < ApplicationController
def index
if @posts = Post.find_by_current_url_or_whatever
render 'index'
else
render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
end
end
end