我正在使用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路由
答案 0 :(得分:4)
关于为什么这不会出现在rake routes
中,首先请注意该任务是如何实现的。它是railties的一部分,它获取显示as such的路线:
Rails.application.routes.routes
所以我们可以看到它正在询问Rails.application
的路线。
接下来请注意Omniauth gem&#34;是一个灵活的认证系统,利用Rack中间件&#34;。
因为它使用Rack中间件,所以它不知道&#39;关于Rails.application
使用的rake routes
的任何内容,因此其路线不会出现在该任务中。
您可以在this Railcast中了解Rack中间件。
稍微深入一点,我们可以从rake middleware
看到OmniAuth::Builder
出现在堆栈中的rails应用之前。那么它如何处理auth/twitter
路线?
通过检查request_path
中的call
,您可以查看here,然后就可以了解request_path
的构建方式{{3}默认情况下,path_prefix
为auth
,您的name
为twitter
。
将Omniauth与Devise一起使用时,会自动设置path_prefix
,如上所述here。
答案 1 :(得分:0)
为什么他们不会出现在佣金路线上,我不确定。但是如果你想知道他们的别名,你可以在这里找到它们:https://github.com/plataformatec/devise/wiki/OmniAuth%3A-Overview
来自他们的文档:
目前,Devise只允许您制作一个可以忽略的模型。 制作名为User omniauthable的模型后,如果是“devise_for :用户“已经添加到你的config / routes.rb,Devise将创建 以下网址方法:
user_omniauth_authorize_path(提供商) user_omniauth_callback_path(提供商)
因此,如果你的路线中有devise_for :model
,你应该看到这个url方法。
示例:
<%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %>
另外,如果你看一下devise的实现,你可以看到URL帮助器在那里:
https://github.com/plataformatec/devise/blob/master/lib/devise/omniauth/url_helpers.rb