2

Facebook 統合のテストを書いています。rspec を実行すると、次のエラーが表示されます

 Failure/Error: before { click_link "Sign in with Facebook" }
 NoMethodError:
 undefined method `provider' for #<Hash:0x007fbe98511798>
 # ./app/models/user.rb:55:in `from_omniauth'

私のOAuthモックには含まれています

OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[:facebook] = {
  'uid'       => "999999",
  'provider'  => "facebook",
  'extra'     => {
    'user_hash' => {
      'email'   => 'test@gmail.com',
      'first_name'  => 'First',
      'last_name'   => 'Last',
      'gender'  => 'Male'
    }
  },
  'credentials' => {
    'token' => "token1234qwert"
  }
}

それが明らかに壊れている正確な場所は

def self.from_omniauth(auth)
  where("fb_provider = ? and fb_uid = ?", auth.provider, auth.uid.to_s).first_or_initialize.tap do |user|

しかしputs auth.to_yaml、最初の行としてa を実行すると、モック認証に含めた他のすべてがfrom_omniauth(auth)表示されます。provider: facebook私はこの時点で迷っています。提案や助けをいただければ幸いです。ありがとう。

4

1 に答える 1

2

コードは次のようになります。

where("fb_provider = ? and fb_uid = ?", auth['provider'], auth['uid'].to_s ...

これはauth、このインスタンスでは がHashオブジェクトであり、Hashオブジェクトがキーと同じ名前のメソッドに応答しないためです。代わりに、Hash#[]私が示したように、メソッドを使用してこれらのキーの値にアクセスする必要があります。

于 2013-07-28T23:49:56.330 に答える