繁体   English   中英

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

[英]Rake routes not showing the route, but it exists when hardcoded

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

关于为什么这不会出现在rake routes ,首先要注意任务是如何实现的。 它是铁路的一部分,它得到的路线如下

Rails.application.routes.routes

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


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

因为它使用Rack中间件,它不会“了解”有关rake routes使用的Rails.application的任何信息,因此它的路由不会出现在该任务中。

您可以在此Railcast中获得Rack中间件的良好介绍。


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

它通过检查一个request_pathcall中,您可以看到支票在这里 ,你可以看到如何request_path是建立在这里path_prefixauth默认情况下,并name你的情况是twitter

使用带有Devise的path_prefix会自动设置path_prefix ,如此处所示

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

从他们的文档:

目前,Devise只允许您制作一个可以忽略的模型。 在创建名为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM