1

Rails ベースの API に取り組んでいます。最近、バージョンアップを試み始めました。(重要な場合に備えて、Versionist gem を使用しています) 1 つのバージョン ('v2') では、Devise と Omniauth を使用して、Facebook/Twitter を介してユーザーを認証します。

このバージョンに関連付けられたすべてのルートに適切なバージョン プレフィックスを付けたい (つまり、 などになります) が、ブロック内に配置すると Devise ヘルパー ( 、など) が機能しなくusers/:username/fooなるv2/users/:username/fooことが既にわかっているので、ブロックの外に住み続けます:devise_forapi_versioncurrent_useruser_signed_in?

ルート.rb:

devise_for :user, :path => '', :controllers => {:omniauth_callbacks => 'users/omniauth_callbacks'}, :skip => [:registrations, :confirmations, :sessions, :passwords]

api_version(:module => "V2", :path=>"v2") do

  resources :authentications, :only => [:update, :destroy]

  devise_scope :user do
    post 'login' => 'sessions#create', :as => 'user_session'
    get 'logout' => 'sessions#destroy'
    post 'password' => 'devise/passwords#create'
    put 'password' => 'devise/passwords#update'
  end

end

Devise が生成した omniauth ルートを除いて、すべてが素晴らしいように見えました:

rake ルートの出力:

 user_omniauth_authorize      /auth/:provider(.:format)
 user_omniauth_callback       /auth/:action/callback(.:format)

さて、いくつかの google-fu が、このためのデバイス構成設定があることを明らかにしたので、デバイス初期化子 ( config/initializers/devise.rb)に以下を追加しました。

Devise.setup do |config|
  config.omniauth_path_prefix = 'v2/auth'
end

現在、レーキ ルートは適切に見えるパスを生成します。

user_omniauth_authorize     /v2/auth/:provider(.:format)          v2/users/omniauth_callbacks#passthru {:provider=>/(?!)/}
user_omniauth_callback      /v2/auth/:action/callback(.:format)          v2/users/omniauth_callbacks#(?-mix:(?!))

ただし、 を呼び出してこのルートにアクセスしようとするとapi.localhost/v2/auth/facebook、ルーティング エラーが発生します。

ActionController::RoutingError (No route matches [GET] "/v2/auth/facebook")

ここで何が起こっているのか分かりますか?

4

1 に答える 1