[英]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_path
在call
中,您可以看到支票在这里 ,你可以看到如何request_path
是建立在这里 ( path_prefix
是auth
默认情况下,并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.