我正在将旧应用程序从 rails 3.0 升级到 rails 4.1,但在设置 devise 和 omniauth 的路由时遇到问题。目前的路线是这样的:
scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
devise_for :users, controllers: {
omniauth_callbacks: "users/omniauth_callbacks"
}
当我运行它时,我收到以下错误:
Devise does not support scoping omniauth callbacks under a dynamic segment (RuntimeError)
and you have set "/(:locale)/users". You can work around by passing
`skip: :omniauth_callbacks` and manually defining the routes. Here is an example:
match "/users/auth/:provider",
constraints: { provider: /google|facebook/ },
to: "devise/omniauth_callbacks#passthru",
as: :omniauth_authorize,
via: [:get, :post]
match "/users/auth/:action/callback",
constraints: { action: /google|facebook/ },
to: "devise/omniauth_callbacks",
as: :omniauth_callback,
via: [:get, :post]
我尝试通过多种方式手动定义路由,但是当我运行测试时,我的所有路由都不起作用。有谁知道用 devise_for 处理这些动态段的正确方法吗?
最佳答案
我在 routes.rb 中添加了 2 次 devise_for
devise_for :users, skip: [:session, :password, :registration], controllers: { omniauth_callbacks: "users/omniauth_callbacks" }
scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
devise_for :users, skip: [:omniauth_callbacks]
找到答案 here
此外,您需要一个用于 omniauth 的自定义故障块来处理登录期间的错误(例如用户取消):
# In config/initializers/omniauth.rb
require 'devise/omniauth'
# Work around for bug when scoping paths
# See: https://github.com/spree/spree_social/issues/130
OmniAuth.config.on_failure = Proc.new do |env|
env['devise.mapping'] = Devise.mappings[:user]
controller_name = ActiveSupport::Inflector.camelize(env['devise.mapping'].controllers[:omniauth_callbacks])
controller_klass = ActiveSupport::Inflector.constantize("#{controller_name}Controller")
controller_klass.action(:failure).call(env)
end
关于ruby-on-rails-3 - 如何使用带有 devise 和 omniauth 的动态范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945671/