【问题标题】:Rake routes not showing the route, but it exists when hardcoded耙路线不显示路线,但硬编码时存在
【发布时间】:2012-06-05 04:43:08
【问题描述】:

我在登录过程中使用了 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 路由

【问题讨论】:

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


    【解决方案1】:

    关于为什么rake routes中没有出现这个,首先注意任务是如何实现的。它是railties 的一部分,它获取显示as such 的路线:

    Rails.application.routes.routes
    

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


    接下来注意Omniauth gem“是一个灵活的利用机架中间件的身份验证系统”。

    因为它使用 Rack 中间件,所以它对rake routes 使用的Rails.application 一无所知,因此它的路由不会出现在该任务中。

    您可以在this Railcast 中获得关于 Rack 中间件的很好的介绍。


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

    它通过在其call 中检查request_path 来做到这一点,您可以看到检查here,并且您可以看到request_path 是如何构建的herepath_prefixauth默认情况下,name 在您的情况下是 twitter

    将 Omniauth 与 Devise 结合使用时,path_prefix 会自动设置,如 here 所述。

    【讨论】:

    • 优秀的答案,很棒的发型! ;)
    【解决方案2】:

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

    来自他们的文档:

    目前,Devise 仅允许您将一个模型设为全能。 在制作一个名为 User omniauthable 的模型后,如果“devise_for :users" 已经添加到您的 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

    【讨论】:

    • 是的.. 试过这个,但不幸的是它也不起作用。未定义的方法错误。 :(
    • 您使用的是哪个版本的omniauth? 1.0 ?
    • 我刚刚从文档中添加了一段。如果您的路线中有 devise_for,它就会起作用。如果它仍然不起作用,我会说你可以提交一张票..
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多