11

Ryanの優れたRailcastSimpleOmniAuthを見た後アプリに認証を実装することができました。

すべてが正常に機能していますが、私の見解では、次のようなリンクがあります。

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

そのため、これらの名前付きルートをどこに作成できるかわかりません。

どんな助けでもありがたいです。ありがとう。

4

3 に答える 3

15

link_toでは、route引数に文字列を指定しているだけであることに注意してください。したがって、ヘルパーファイルでメソッドを定義するだけです。

# 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 %>
于 2010-12-06T06:01:51.303 に答える
3

これをあなたに追加してくださいroutes.rb

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

oauth_pathこれで、 URLヘルパーを使用してURLを生成できます。

例えば。oauth_path(:facebook) # => /auth/facebook

于 2016-10-19T08:14:49.667 に答える
-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') %>
于 2011-11-14T12:12:33.427 に答える