2012-02-09 24 views
5

Sau khi làm theo:Rails 3.1 lập mưu Oauth cho Facebook tuyến nhầm lẫn

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

Tôi có thể đăng ký một người dùng thông qua Facebook. Nhưng tôi đang đấu tranh để xác định chuyển hướng của riêng tôi.

Rõ ràng nó hoàn hảo mà một người dùng hiện rằng đã facebook đăng ký/trong chuyển hướng đến ứng dụng của tôi và tiếp tục trên, nhưng đó là trường hợp của những người dùng mới được tạo ra thông qua facebook tôi quan tâm.

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    # You need to implement the method below in your model 
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user) 

    if @user.persisted? 
     flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook" 
     sign_in_and_redirect @user, :event => :authentication 
    else 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 
end 

User.persisted có nghĩa là gì? find_for_facebook_oauth cũng giống như trang wiki phát sinh quy định; tức là tìm người dùng bằng email và trả lại email nếu họ tồn tại hoặc tạo người dùng mới có mật khẩu autogen nếu không.

Nhưng tôi cần nó để chuyển hướng người dùng mới được tạo đến trang nơi họ đặt mật khẩu của họ. Tôi không muốn các mật khẩu còn tồn tại, tôi muốn người dùng ngay lập tức được trình bày với một màn hình để a) xác nhận tên của họ và b) xác nhận mật khẩu của họ.

Tôi có màn hình như vậy được triển khai cho những người chấp nhận lời mời (qua số https://github.com/scambra/devise_invitable/) trong chế độ xem/đưa ra/lời mời/chỉnh sửa - điều này hoàn toàn phù hợp với điều này nếu nó hoạt động.

Tôi nên thêm chuyển hướng vào đâu và định dạng chuyển hướng này sẽ đi theo định dạng nào? Tôi thấy phương pháp facebook ở trên khá khó hiểu để giải thích. Tôi không thể hiểu tại sao nó sẽ chuyển hướng đến một url đăng ký người dùng mới - người dùng được tạo ra hoặc tồn tại, do đó, những gì hiện vẫn còn liên quan đến?

Rõ ràng là nhầm lẫn, vì vậy hãy giúp đánh giá cao. :)

Cảm ơn,

Dave

Trả lời

9

các .persisted? phương pháp kiểm tra xem kỷ lục được lưu trong cơ sở dữ liệu của bạn. Đó là cách của phương pháp kiểm tra nếu người dùng đã được tìm thấy hoặc tạo thành công. Nếu không, nó chuyển hướng đến new_user_registration_url vì đăng ký không thành công (cho phép người dùng thử lại).

Để chuyển hướng dựa trên việc người dùng có mới hay không, bạn có thể kiểm tra đối tượng người dùng cho một số cờ cho biết họ là người mới. Bạn nói mật khẩu, do một cái gì đó như thế này có thể làm việc (chưa được kiểm tra):

if @user.persisted? 
    flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook" 
    if @user.password.exists? 
    sign_in_and_redirect @user, :event => :authentication 
    else 
    sign_in @user 
    redirect_to ______ #insert path to set password etc 
    end 
else 
    session["devise.facebook_data"] = request.env["omniauth.auth"] 
    redirect_to new_user_registration_url 
end 

một sự thay thế (nếu bạn muốn để có được tinh chỉnh nhiều hơn), bạn có thể muốn tùy chỉnh after_sign_in_path_for(resource_or_scope), như mô tả on the Devise wiki

+1

bạn là chính xác . Tôi đã sử dụng sign_in_count (một phần của sự phát minh) để xác định xem đó có phải là lần đầu tiên người dùng đăng nhập hay không. Cảm ơn lời giải thích rõ ràng. – Dave

+0

không sao cả! bỏ phiếu nếu nó hữu ích :) –

+0

@Dave: Trong đó tập tin xem nên được viết bằng mã nào? – inquisitive