6

OmniAuthgemで使用するためにロードされたプロバイダーを知りたいのですが。私はこれを試しました:

OmniAuth::Strategies.constants  # a method provided by the standard lib Module class
# => [:Developer, :OAuth, :Twitter]

この:

OmniAuth.strategies.inspect # a method provided by the OmniAuth class, but which has no documentation or comments around it.
# => [OmniAuth::Strategies::OAuth]

私が期待する(または望む)答えは[:Developer, :Twitter]、テストコードのように、明示的にtwitterをロードしただけであり、提供された開発者はデフォルトでロードされます。

(これはすべて、OmniAuthが実行しているものに応じて、別のライブラリが機能するための正しいものをロードできるようにするためです。)

方法があり、それを知っているなら、私に知らせてください。そうでなければ、私は実用的で、最初の例のリストからOAuthをノックアウトします。

Rubyは1.9.3で、OmniAuthはv1.1.1です。

4

2 に答える 2

17

iainと同じリストが必要だったので、Deviseユーザーのためにこれをここに追加します。

I tried using the accepted answer at the top of my devise initializer in a Rails project, but I got an error (@@providers was not defined).

After looking into the Devise source code, I used the following to get an array of symbols:

Devise.omniauth_configs.keys # => [:facebook, :twitter]
于 2013-09-14T12:35:29.287 に答える
6

OmniAuth :: Strategiesは、利用可能で登録されている戦略を一覧表示します。「使用中」のものではありません。OmniAuth Builderのコードを掘り下げると、プロバイダーブロックでミドルウェアとして使用してさまざまな戦略がRackに渡されることがわかりますuse。これにより、戦略の追跡が困難になります。もう1つの「実用的な」アプローチは、OmniAuth Builderにモンキーパッチを適用し、プロバイダーを追跡することです。

module OmniAuth
  class Builder < ::Rack::Builder
    def provider_patch(klass, *args, &block)
      @@providers ||= []
      @@providers << klass
      old_provider(klass, *args, &block)
    end
    alias old_provider provider
    alias provider provider_patch
    class << self
      def providers
        @@providers
      end
    end
  end
end

プロバイダーを構成する前に、このパッチを含めてください。すべてのプロバイダーがロードされるOmniAuth::Builder.providersと、必要な配列が提供されます。

開発者戦略は利用可能ですが、ロードされていません。指定した場合にのみロードされます

provider :developer
于 2012-10-28T22:53:04.527 に答える