11

在观看了 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

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

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

4

3 回答 3

15

请注意,在 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 %>
于 2010-12-06T06:01:51.303 回答
3

将此添加到您的routes.rb

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

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

例如。oauth_path(:facebook) # => /auth/facebook

于 2016-10-19T08:14:49.667 回答
-6

使用 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') %>
于 2011-11-14T12:12:33.427 回答