2012-11-14 2 views
0

페이스 북 및 트위터에 다중 로그인을 제공하기 위해 현재의 시스템에서 인증 컨트롤러를 추가하려고합니다. 이렇게하려면이 자습서를 따르십시오. http://railscasts.com/episodes/236-omniauth-part-2레일즈 - 빌드가 데이터베이스에 레코드를 생성하지 않습니다.

아직 등록하지 않은 사람이 트위터에 등록하려고하면 내 문제가 생깁니다. 그래서 사용자와 인증을 모두 만들어야합니다.

 user = User.new 
     token = omni['credentials'].token 
     token_secret = omni['credentials'].secret 
     user.provider = omni.provider 
     user.uid = omni.uid 

     user.authentications.build(:provider => omni['provider'], :uid => omni['uid'], :token => token, :token_secret => token_secret) 

     if user.save 
     flash[:notice] = "Logged in." 
     sign_in_and_redirect(:user, user)     
     else 
     session["devise.user_attributes"] = user.attributes 
     redirect_to new_user_registration_path 
     end 

그래서 등록 과정의 끝에, 새 사용자가 생성됩니다 :

내 코드는 다음과 같다. 그러나 데이터베이스에서는 해당 사용자와 관련하여 트위터 인증 레코드가 표시되지 않습니다.

user.authentications.build 때문에 그런가요?

나를 도울 수 있다면 좋을 것입니다.

감사합니다.

답변

3

데이터 포인트로서 : 당신이 언급하고있는 railscasts는 railscsts가 참조하는 것보다 다른 전략을 가진 Omniauth pre-1.0을 참조합니다. (참고 : 실제 사이트에서 참조하는 정확한 방법을 사용하고 있습니다.) 이 경우 빌드는 "apply_omniauth"를 호출합니다. -

리소스를 빌드하는 등록 컨트롤러를 만들었습니다 (비디오에서 참조한대로). 여기 내 현재 작업 예제는 :

current_user.authentication.create!(:provider => omniauth['provider'], :uid => omniauth['uid']) 

는 희망이 도움이 :

class RegistrationsController < Devise::RegistrationsController 
    def create 
    super 
    session[:omniauth] = nil unless @user.new_record? 
    end 

    private 

    def build_resource(*args) 
    super 
    if session[:omniauth] 
     # apply omniauth calls the user model and applies omniauth session to the info 
     @user.apply_omniauth(session[:omniauth]) 

     # 
     @user.valid? 
    end 
    end 
end 

그러나, 당신은 여전히 ​​여기 내 정확한 호출입니다, 인증 기록을 작성해야합니다.

+0

기본적으로 등록 컨트롤러 외에도 create를 사용하고 있습니다! 빌드 대신? – CanCeylan

+0

수정. Jesse가 아래에서 언급했듯이 빌드와 생성의 차이점은 무엇입니까? – Chris

+0

네, 정말 고마워요. 그리고 업데이트 보석으로 프로세스의 모든과 자습서를 쓰고 레일 버전 : http://www.orhancanceylan.com/rails-twitter-and-facebook-authentications-with-omniauth-and-devise/은 아니, 추가 – CanCeylan

0

Devise + Omniauth를 사용하고 있다면 더 최근의 Railscast을 살펴볼 수 있습니다. Devise gem의 새 버전에는 OmniAuth가 기본적으로 지원됩니다.

+0

예를, 나는 내 웹 사이트를 구축 그 튜토리얼에 관해서. 하지만 이제는 여러 인증을 제공하려고합니다. 그것이 새로운 컨트롤러를 만드는 이유입니다. – CanCeylan

2

네,이 때문에 빌드입니다

User.build # allocates a new record for you 
User.create # allocates and then saves a new record for you 

그래서 난 당신이

user.authentications.create(:provider => omni['provider'], 
          :uid => omni['uid'], 
          :token => token, 
          :token_secret => token_secret) 

는 또한, 당신은 저장하지 않습니다 만드는 경우를 처리해야합니다 생각 (검증 문제)

+0

그러나 예를 들어 트위터로 인증 된 사용자는 전자 메일을 저장하기 전에 입력하라는 메시지가 표시됩니다.이 단계에서 사용자는 등록 프로세스를 취소 할 수 있습니다. 그런 다음 nil 사용자에 대한 인증 레코드를 갖고 있지 않습니까? – CanCeylan

+0

Btw, 그 문제에서 나는이 오류가 발생했습니다 : "사용자가 아직 저장하지 않았기 때문에 부모가 저장되지 않으면 create를 호출 할 수 없습니다". – CanCeylan

0

예 빌드 때문에 새 레코드처럼 데이터베이스에 저장하지 않고 레코드를 작성하는 데 사용합니다. 모델에 당신이 Userhas_many :authentications이있는 경우

, 당신은 자동으로 사용자가 저장 될 때 인증을 저장 true로 autosave 옵션을 설정할 수 있습니다

has_many :authentications, autosave: true

+0

자동 저장을 사용하지만 여전히 사용자 만 생성합니다 :/ – CanCeylan

+0

o_O, 버그 일 수 있습니다. RoR의 마지막 버전을 사용하고 있습니까? –

관련 문제