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处理这些动态段的正确方法?
我在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)
| 归档时间: |
|
| 查看次数: |
1966 次 |
| 最近记录: |