Rake路线不显示路线,但在硬编码时存在

时间:2012-05-30 22:02:57

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

我正在使用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路由

2 个答案:

答案 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_prefixauth,您的nametwitter

将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