4

我在登录过程中使用 Devise 和 Omniauth。出于某种原因,我可以很好地访问“users/auth/facebook”或“users/auth/twitter”路线。但是当我执行 rake 路由时它们不会出现,所以我不知道获取这些路径的辅助方法是什么(例如 something_something_path)。有人可以帮我吗?

我不能显示我的所有路由,但我可以说唯一匹配“/users/auth/...”的路由是这个(来自 rake 路由):

 user_omniauth_callback        /users/auth/:action/callback(.:format)    {:action=>/(?!)/, :controller=>"users/omniauth_callbacks"}

顺便说一句,当我说我“可以很好地访问路线”时,我的意思是这有效(将我正确重定向到 facebook 或 twitter):

<%= link_to "Connect", "users/auth/facebook" %>

此外,路由应该是用户模型的默认 Devise omniauth 路由

4

2 回答 2

3

关于为什么这没有出现在 中rake routes,首先要注意任务是如何实现的。它是railties的一部分,它会显示如下所示的路线:

Rails.application.routes.routes

所以我们可以看到它正在询问Rails.application它的路线。


接下来请注意,Omniauth gem “是一个使用 Rack 中间件的灵活身份验证系统”。

因为它使用 Rack 中间件,所以它不“知道”任何关于Rails.applicationused by 的信息rake routes,因此它的路由不会出现在该任务中。

您可以在这个 Railcast中很好地介绍 Rack 中间件。


再深入一点,我们可以看到rake middleware出现OmniAuth::Builder在堆栈中的 rails 应用程序之前。那么它是如何处理auth/twitter路由的呢?

它通过request_path在其中检查 a 来做到这一点,您可以在此处call查看检查,并且您可以在此处查看 是如何构建的(默认情况下是,在您的情况下是.request_pathpath_prefixauthnametwitter

将 Omniauth 与 Devise 一起使用时,path_prefix会自动设置,如此所述。

于 2012-05-31T15:28:47.603 回答
0

为什么他们不出现在 rake 路线上,我不确定。但是如果你想知道他们的别名,你可以在这里找到他们:https ://github.com/plataformatec/devise/wiki/OmniAuth%3A-Overview

从他们的文档中:

目前,Devise 仅允许您将一种模型设为全能。在创建一个名为 User omniauthable 的模型后,如果“devise_for :users”已经添加到您的 config/routes.rb 中,Devise 将创建以下 url 方法:

user_omniauth_authorize_path(提供者) user_omniauth_callback_path(提供者)

因此,如果您devise_for :model的路线中有您应该看到该 url 方法。

例子:

<%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %>

此外,如果您查看设计的实现,您可以看到 URL 助手在那里:

https://github.com/plataformatec/devise/blob/master/lib/devise/omniauth/url_helpers.rb

于 2012-05-30T22:11:19.037 回答