2014-02-27 1 views
0

나는 사용자가 OmniAuth를 사용하여 Twitter를 통해 내 앱에 등록 할 수있게하고 있으며, 겉보기에는 이상한 행동을하고 있습니다. 먼저 사용자 모델을 만든 다음 인증 해시를 생성하여 내 메서드로 보내 데이터베이스에서 사용자를 만들거나 반환하려면 잘 작동합니다. 먼저 User 모델을 만들지 않으면 동일한 메소드에 보내는 해시 값에 "정의되지 않은 메소드 'provider for'가 표시됩니다. 여기 OmniAuth 등록 테스트가 실패하고 로그인이 통과합니까?

FactoryGirl.define do 
    factory :user do 
    name 'NewUser' 
    email '[email protected]' 
    password 'testing' 
    password_confirmation 'testing' 
    home_dropzone 'New Dropzone' 
    bio "Here's a short description about things" 
    provider 'twitter' 
    uid '1234567' 
    end 
end 

내 사용자입니다 : 내가 여기

내 user_spec.rb 여기

require 'spec_helper' 

describe User do 
    it "should have a name" do 
    @user = FactoryGirl.create(:user) 
    should respond_to(:name) 
    end 

    it "should allow registration via twitter" do 
     auth = { 
     :provider => "twitter", 
     :uid => '1234567', 
     :info => { 
      :nickname => 'NewUser' 
     } 
    } 
     tested_user = User.process_omniauth(auth) 
     expect(tested_user.persisted?).to be_false 
    end 

    it "should allow login via twitter" do 
    @user = FactoryGirl.create(:user) 
    auth = { 
     :provider => "twitter", 
     :uid => '1234567', 
     :info => { 
      :nickname => 'NewUser' 
     } 
    } 
    tested_user = User.process_omniauth(auth) 
    expect(tested_user).to eq(@user) 
    end 

end 

입니다 ... 내 공장 users.rb 내가 잘못거야 어디 있는지됩니다 아니에요 .rb 모델을 다음과 같이

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, :omniauthable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :jumps 

    validates :name, presence: true 

    def self.process_omniauth(auth) 
    where(auth.slice(:provider, :uid)).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.name = auth.info.nickname 
    end 
    end 

    def self.new_with_session(params, session) 
    if session['devise.user_attributes'] 
     new(session['devise.user_attributes'], without_protection: true) do |user| 
      user.attributes = params 
      user.valid? 
     end 
    else 
     super 
    end 
    end 

    def password_required? 
    super && provider.blank? 
    end 

    def update_with_password(params, *options) 
    if encrypted_password.blank? && provider.present? 
     update_attributes(params, *options) 
    else 
     super 
    end 
    end 

end 

그리고 RSpec에에서 내 출력은 다음과 같습니다

Failures: 

1) User should allow registration via twitter 
Failure/Error: tested_user = User.process_omniauth(auth) 
NoMethodError: 
    undefined method 'provider' for #<Hash:0xb2348ac> 
# ./app/models/user.rb:13:in 'block in process_omniauth' 
# ./app/models/user.rb:12:in 'process_omniauth' 
# ./spec/models/user_spec.rb:18:in 'block (2 levels) in <top (required)>' 

사용자 Process_omniauth 메소드에 전달 된 해시에 액세스 할 수없는 이유가 확실하지 않습니다. 누구라도 내가 왜 열쇠에 액세스하지 못하게하는지 설명 할 수 있다면, 나는 매우 행복 할 것이다.

답변

1

해시는 키를 기능으로 다시 매핑하지 않습니다.

a = { foo: :bar, baz: :qux } 

가 나는 그러나

a.foo 

사용하도록 허용하고 있지 않다, 난 그냥 auth[:key]auth.key 통화를 변경하여 User 모델에 따라서

a[:foo] 

을 할 수 있어요.

+0

감사합니다. 이게 내 문제를 해결했습니다. 나는 여전히 "auth.provider, auth.uid 등을 통해 값을 액세스 할 수 있었는지 확신 할 수 없습니다."내 트위터를 통한 로그인을 허용해야합니다. "테스트가 아니라 다른 하나의 테스트가 통과해야합니다. .first_or_create를 호출하고 항목 (예 : 내 사용자 팩토리가 객체를 만들 때)을 찾으면 인증은 사용 가능한 이러한 함수가있는 해시 이외의 항목이됩니까? –

+0

당신은 아마도 어떤 형태의 물건을 가지고 있었을 것입니다. 그것이 당신이 할 수 있었던 이유입니다. –

관련 문제