Создание именованных маршрутов для OmniAuth в Rails 3

После просмотра отличного Simple OmniAuth Райана Railcast мне удалось реализовать аутентификацию в моем приложении. .

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

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

or:

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

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

Любая помощь будет оценена. Спасибо.


person Daniel Perez Alvarez    schedule 05.12.2010    source источник


Ответы (3)


Обратите внимание, что в 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 %>
person monocle    schedule 06.12.2010
comment
Как это работает с приложением, развернутым на Sub-URI? - person graywh; 24.09.2011
comment
Как бы вы обработали дополнительные параметры? (например, параметр «происхождение»). В идеале signin_path должен принимать все параметры, которые принимает обычный метод *_path. - person Marc; 26.02.2013
comment
Кроме того, как бы вы сделали этот метод доступным для контроллеров? - person Marc; 26.02.2013
comment
Хотя это старый ответ и комментарии, но для полноты этот вопрос также отвечает о контроллерах. - person mlt; 08.11.2016

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

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

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

Eg. oauth_path(:facebook) # => /auth/facebook

person Agent47DarkSoul    schedule 19.10.2016

С 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') %>
person gbelleguic    schedule 14.11.2011
comment
Это приведет к неправильному созданию ссылки на URL-адрес обратного вызова вместо URL-адреса перенаправления OmniAuth '/auth/:provider'. - person Dale Campbell; 06.05.2012