OmniAuth не работает с маршрутизацией в Rails3 - PullRequest
7 голосов
/ 03 апреля 2011

Я пытаюсь следовать Railscast 241 Простой OmniAuth , и он работает нормально, если у меня нет Route Globbing в конце /config/routes.rb:

match '*uri' => "posts#index"

Если я запрашиваю /auth/twitter с помощью globbing OmniAuth ничего не делает:

Started GET "/auth/twitter" for 127.0.0.1 at 2011-04-03 19:17:44 +0200
  Processing by PostsController#index as HTML
  Parameters: {"uri"=>"auth/twitter"}
Rendered posts/index.html.haml within layouts/application (9.0ms)
Completed 200 OK in 103ms (Views: 14.6ms | ActiveRecord: 0.7ms)

Без маршрута globbing он аутентифицируется корректно.

Есть ли способ, чтобы и Globbing маршрута, и OmniAuth?

Ответы [ 2 ]

17 голосов
/ 04 апреля 2011

Процесс OmniAuth обеспечивает следующие функциональные возможности при вызове URL-адреса /auth/:provider:

  1. Передать запрос в основное приложение Rack / Rails, как будто OmniAuth там не было;
  2. Определите, генерирует ли базовое приложение 404;
  3. Если это так, вызовите актуальную функциональность 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
0 голосов
/ 04 апреля 2011

Слегка измененное предложение Брэндона Тилли :

# config/routes.rb
match '/auth/:provider/callback' => 'sessions#create'
match 'auth/*rest' => 'application#omniauth'
match '*uri' => 'posts#index'

# app/controllers/application_controller.rb
def omniauth
  render text: 'Authentication', status: 404
end
...