簡體   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