开发者

Create named routes for OmniAuth in Rails 3

开发者 https://www.devze.com 2023-01-28 07:11 出处:网络
After having watched Ryan\'s excellent Railcast Simple OmniAuth, I\'ve managed to implement authentication in my app.

After having watched Ryan's excellent Railcast Simple OmniAuth, I've managed to implement authentication in my app.

Everything is working fine, but in my view I have links that look like this:

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

I was wondering if there is an elegant way to create a named route to replace that with:

<%= 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 already handles those routes... In my routes.rb file I only have stuff for callbacks and signing out:

match '/signin/:provider/callback' => 'sessions#create'
match '/signout' => 'sess开发者_JS百科ions#destroy', :as => :signout

So I don't know where I could create those named routes.

Any help will be appreciated. Thanks.


Notice that in link_to, you're just providing a string for the route argument. So you can just define a method in a helpers file.

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

If you want to get all 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 %>


Add this to your routes.rb

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

Now you can use oauth_path url helper to generate urls.

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


With Rails 3 you can do :

# 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

精彩评论

暂无评论...
验证码 换一张
取 消