ruby-on-rails-3 - 如何使用带有 devise 和 omniauth 的动态范围

标签 ruby-on-rails-3 ruby-on-rails-4 devise routes omniauth

我正在将旧应用程序从 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/

相关文章:

ruby - mongoid查询缓存

ruby-on-rails - 针/定义上下文.rb :36: warning: undefining `initialize' may cause serious problems

ruby-on-rails - 在特定页面中显示用户的帖子 - Rails

ruby-on-rails - 使用 find_by_sql 查询设计模型时列用户名不存在错误

ruby-on-rails - 在自定义 Controller 中设计资源和资源名称助手

ios - Restkit 发送 Get 请求而不是 Post

ruby-on-rails - rails - 搜索 Controller

ruby - 如何制作可选的强参数键但过滤嵌套参数?

ruby-on-rails - Rspec 未在 Rails 4 beta 中生成 *_spec.rb 文件

ruby-on-rails - devise/cancan模拟帐户