【问题标题】:Create named routes for OmniAuth in Rails 3在 Rails 3 中为 OmniAuth 创建命名路由
【发布时间】:2010-12-05 23:32:41
【问题描述】:

在观看了 Ryan 出色的 Railcast Simple OmniAuth 之后,我设法在我的应用中实现了身份验证。

一切正常,但在我看来,我的链接如下所示:

<%= link_to 'Sign in with Twitter', '/signin/twitter' %>
<%= link_to 'Sign in with Facebook', '/signin/facebook' %>

我想知道是否有一种优雅的方式来创建命名路由来替换它:

<%= link_to 'Sign in with Twitter', signin_twitter_path %>
<%= link_to 'Sign in with Facebook', signin_facebook_path %>

或:

<%= link_to 'Sign in with Twitter', signin_path(:twitter) %>
<%= link_to 'Sign in with Facebook', signin_path(:facebook) %>

OmniAuth 已经处理了这些路由...在我的 routes.rb 文件中,我只有用于回调和退出的内容:

match '/signin/:provider/callback' => 'sessions#create'
match '/signout' => 'sessions#destroy', :as => :signout

所以我不知道在哪里可以创建这些命名路线。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: ruby-on-rails routes omniauth


    【解决方案1】:

    请注意,在 link_to 中,您只是为路由参数提供了一个字符串。所以你可以在帮助文件中定义一个方法。

    # application_helper.rb
    module ApplicationHelper
      def signin_path(provider)
        "/auth/#{provider.to_s}"
      end
    end
    
    # view file
    <%= link_to 'Sign in with Twitter', signin_path(:twitter) %>
    

    如果你想获得所有元数据

    # application_helper.rb
    module ApplicationHelper
      def method_missing(name, *args, &block)
        if /^signin_with_(\S*)$/.match(name.to_s)
          "/auth/#{$1}"
        else
         super
        end
      end
    end
    
    #view file
    <%= link_to 'Sign in with Twitter', signin_with_twitter %>
    

    【讨论】:

    • 这如何与部署到子 URI 的应用程序一起工作?
    • 你会如何处理额外的参数? (例如“原点”参数)。理想情况下,signin_path 会接受常规 *_path 方法会接受的所有参数。
    • 另外,你如何让控制器可以使用这个方法?
    • 虽然这是一个旧的答案和 cmets,但为了完整起见this question 也回答了关于控制器的问题。
    【解决方案2】:

    将此添加到您的routes.rb

    get "/auth/:provider", to: lambda{ |env| [404, {}, ["Not Found"]] }, as: :oauth

    现在你可以使用oauth_path url helper 来生成url。

    例如。 oauth_path(:facebook) # =&gt; /auth/facebook

    【讨论】:

      【解决方案3】:

      使用 Rails 3 你可以做到:

      # routes.rb
      match '/signin/:provider/callback' => 'sessions#create', :as => :signing
      
      #view.erb
      <%= link_to 'twitter', signing_path(:provider => 'twitter') %>
      <%= link_to 'facebook', signing_path(:provider => 'facebook') %>
      

      【讨论】:

      • 这将错误地创建指向 callback URL 的链接,而不是 '/auth/:provider' 的 OmniAuth 重定向 URL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多