Rake路由未显示路由,但在硬编码时存在

4
我正在使用Devise和Omniauth进行登录。由于某种原因,我可以很好地访问路由“users/auth/facebook”或“users/auth/twitter”。但是当我运行rake routes时,它们不会显示出来,因此我不知道获取这些路径的帮助程序方法是什么(例如something_something_path)。有人能帮帮我吗?
我不能展示所有的路由,但我可以说唯一与“/users/auth/…”匹配的路由是这个(来自rake routes):
 user_omniauth_callback        /users/auth/:action/callback(.:format)    {:action=>/(?!)/, :controller=>"users/omniauth_callbacks"}

顺便说一下,当我说“可以正常访问路由器”时,我的意思是这个可以正常工作(正确地将我重定向到Facebook或Twitter):

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

此外,路由应该是用户模型的默认 Devise omniauth 路由。
2个回答

4
关于为什么这不会在rake routes中显示,首先请注意任务的实现方式。它是railties的一部分,并且使路由显示如此
Rails.application.routes.routes

我们可以看到它正在请求Rails.application的路由。
请注意,Omniauth gem是一个灵活的身份验证系统,利用Rack中间件。由于它使用了Rack中间件,因此它不知道rake routes使用的Rails.application,所以它的路由不会出现在该任务中。您可以在this Railcast中获得有关Rack中间件的良好介绍。
深入了解后,我们可以从rake middleware中看到,在堆栈中,OmniAuth::Builder出现在你的rails应用程序之前。那么它如何处理auth/twitter路由?
它通过在其call中检查request_path来实现,您可以在这里here看到检查,以及您可以在这里here看到如何构建request_path(默认情况下,path_prefixauth,在您的情况下,nametwitter)。
当使用Devise与Omniauth时,path_prefix会自动设置,如here所述。

1
非常棒的回答,发型也很赞! ;) - asymmetric

0

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

从他们的文档中可以看到:

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

user_omniauth_authorize_path(provider) user_omniauth_callback_path(provider)

因此,如果您在路由中有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


是的,我尝试过了,但不幸的是它也不起作用。未定义方法错误。 :( - varatis
你使用的omniauth版本是哪个?1.0吗? - Arthur Neves
我刚刚从文档中添加了一部分。如果你的路由中有devise_for,它就可以正常工作了。如果它仍然不起作用,我建议你可以提交一个工单。 - Arthur Neves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接