如何使用设计和omniauth动态范围

tru*_*iso 5 routes devise omniauth ruby-on-rails-3 ruby-on-rails-4

我正在将旧的应用程序从rails 3.0升级到rails 4.1,并且无法设置设计和omniauth的路由.目前路线看起来像这样:

scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
      devise_for :users, controllers: {
            omniauth_callbacks: "users/omniauth_callbacks"
      }
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到以下错误:

 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]
Run Code Online (Sandbox Code Playgroud)

我试图通过多种方式手动定义路线,但是当我运行测试时,我的路线都没有工作.有没有人知道用devise_for处理这些动态段的正确方法?

Dmi*_*riy 8

我在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]
Run Code Online (Sandbox Code Playgroud)

这里找到答案

此外,您需要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
Run Code Online (Sandbox Code Playgroud)

  • Devise wiki上的解决方案非常有效:https://github.com/plataformatec/devise/wiki/How-To:-OmniAuth-inside-localized-scope (2认同)