2010-12-05 32 views
8

Después de haber visto el excelente Railcast Simple OmniAuth de Ryan, he logrado implementar la autenticación en mi aplicación.Crear rutas con nombre para OmniAuth en Rails 3

todo está funcionando bien, pero en mi opinión que tienen enlaces que se ven así:

<%= link_to 'Sign in with Twitter', '/signin/twitter' %> 
<%= link_to 'Sign in with Facebook', '/signin/facebook' %> 

Me preguntaba si hay una manera elegante para crear una ruta nombrado para reemplazar eso con:

<%= link_to 'Sign in with Twitter', signin_twitter_path %> 
<%= link_to 'Sign in with Facebook', signin_facebook_path %> 

o:

<%= link_to 'Sign in with Twitter', signin_path(:twitter) %> 
<%= link_to 'Sign in with Facebook', signin_path(:facebook) %> 

OmniAuth ya maneja las rutas ... En mi routes.rb archivo sólo tengo cosas para las devoluciones de llamada y cierre de sesión:

match '/signin/:provider/callback' => 'sessions#create' 
match '/signout' => 'sessions#destroy', :as => :signout 

Así que no sé donde podría crear esas rutas con nombre.

Cualquier ayuda será apreciada. Gracias.

Respuesta

12

Observe que en link_to, solo está proporcionando una cadena para el argumento de ruta. Entonces puedes definir un método en un archivo de ayuda.

# 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) %> 

Si desea obtener todos los meta

# 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

¿Cómo funciona esto con una aplicación desplegada en un Sub-URI? – graywh

+0

¿Cómo manejaría parámetros adicionales? (por ejemplo, el parámetro 'origen'). Lo ideal es que signin_path acepte todos los parámetros que un método regular * _path. – Marc

+2

Además, ¿cómo haría que este método esté disponible para los controladores? – Marc

-6

con los carriles 3 que puede hacer:

# 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') %> 
+12

Esto creará incorrectamente un enlace a la * URL de devolución de llamada *, en lugar de la URL de redireccionamiento de OmniAuth de '/ auth /: proveedor'. –

0

Agregar a su routes.rb

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

Ahora puede usar el url helper oauth_path para generar urls.

Por ejemplo. oauth_path(:facebook) # => /auth/facebook

Cuestiones relacionadas