我正在开发基于 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?
等)工作,所以它继续住在街区外:
路线.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路线:
耙路线输出:
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 routes 会生成看起来合理的路径:
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")
知道这里发生了什么吗?