在观看了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
所以我不知道在哪里可以创建那些命名的路线。
任何帮助将不胜感激。感谢。
答案 0 :(得分:14)
请注意,在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 %>
答案 1 :(得分:2)
将此添加到您的routes.rb
get "/auth/:provider", to: lambda{ |env| [404, {}, ["Not Found"]] }, as: :oauth
现在您可以使用oauth_path
url helper来生成网址。
EG。 oauth_path(:facebook) # => /auth/facebook
答案 2 :(得分:-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') %>