나는 사용자가 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 메소드에 전달 된 해시에 액세스 할 수없는 이유가 확실하지 않습니다. 누구라도 내가 왜 열쇠에 액세스하지 못하게하는지 설명 할 수 있다면, 나는 매우 행복 할 것이다.
감사합니다. 이게 내 문제를 해결했습니다. 나는 여전히 "auth.provider, auth.uid 등을 통해 값을 액세스 할 수 있었는지 확신 할 수 없습니다."내 트위터를 통한 로그인을 허용해야합니다. "테스트가 아니라 다른 하나의 테스트가 통과해야합니다. .first_or_create를 호출하고 항목 (예 : 내 사용자 팩토리가 객체를 만들 때)을 찾으면 인증은 사용 가능한 이러한 함수가있는 해시 이외의 항목이됩니까? –
당신은 아마도 어떤 형태의 물건을 가지고 있었을 것입니다. 그것이 당신이 할 수 있었던 이유입니다. –