Создание именованных маршрутов для OmniAuth в Rails 3 - PullRequest
9 голосов
/ 06 декабря 2010

После просмотра отличного 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

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

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

Ответы [ 3 ]

14 голосов
/ 06 декабря 2010

Обратите внимание, что в 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 %>
3 голосов
/ 19 октября 2016

Добавьте это к вашему routes.rb

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

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

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

0 голосов
/ 14 ноября 2011

С 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') %>
...