【发布时间】:2012-10-30 18:41:36
【问题描述】:
我正在开发基于 Rails 的 API。我最近开始尝试对其进行版本控制。 (我使用的是Versionist gem,以防万一)一个版本('v2')使用 Devise 和 Omniauth 通过 Facebook/Twitter 对用户进行身份验证。
我希望与此版本关联的所有路由都具有适当的版本前缀(因此 users/:username/foo 变为 v2/users/:username/foo 等),但我已经发现将 devise_for 放在 api_version 块内阻止 Devise 助手(current_user、user_signed_in? 等)工作,因此它继续存在于块外:
routes.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
一切看起来都很棒......除了设计生成的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
现在,rake 路由会生成看起来合理的路径:
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")
知道这里发生了什么吗?
【问题讨论】:
标签: ruby-on-rails-3 devise routes omniauth