2010-12-05 6 views
8

После просмотра замечательного Ryan's Railcast Simple OmniAuth, мне удалось реализовать проверку подлинности в моем приложении.Создайте именованные маршруты для OmniAuth в Rails 3

Все работает отлично, но на мой взгляд, у меня есть ссылки, которые выглядят следующим образом:

<%= 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 

Так что я не знаю, где я мог бы создать эти именованные маршруты.

Любая помощь будет оценена по достоинству. Благодарю.

ответ

12

Обратите внимание, что в 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 %> 
+5

Как это работает с приложением, развернутым в Sub-URI? – graywh 2011-09-23 21:48:15

+0

Как бы вы обрабатывали дополнительные параметры? (например, «исходный» параметр). В идеале signin_path принимал бы все параметры обычным методом * _path. – Marc 2013-02-26 15:08:11

-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') %> 
0

Добавьте это в routes.rb

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

Теперь вы можете использовать вспомогательный URL-адрес oauth_path для генерации URL-адресов.

Например. oauth_path(:facebook) # => /auth/facebook