[英]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.