Rails ベースの API に取り組んでいます。最近、バージョンアップを試み始めました。(重要な場合に備えて、Versionist gem を使用しています) 1 つのバージョン ('v2') では、Devise と Omniauth を使用して、Facebook/Twitter を介してユーザーを認証します。
このバージョンに関連付けられたすべてのルートに適切なバージョン プレフィックスを付けたい (つまり、 などになります) が、ブロック内に配置すると Devise ヘルパー ( 、など) が機能しなくusers/:username/foo
なるv2/users/:username/foo
ことが既にわかっているので、ブロックの外に住み続けます:devise_for
api_version
current_user
user_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")
ここで何が起こっているのか分かりますか?