2012-02-04 79 views
1

我們對Rails很陌生,希望使用我們主頁上的Javascript SDK「Connect with Facebook」按鈕。在我們的應用中使用此按鈕,我們希望允許用戶通過Facebook註冊我們的網站,並能夠將他們的Facebook個人資料圖片用作我們網絡應用的個人資料圖片。Rails 3應用程序 - 與Facebook連接的最佳方式

用我們的Rails 3應用程序實現這個Facebook連接的最佳方式是什麼?

devise_for :users 

    resources :authentications 

    resources :users do 
     member do 
     get :following, :followers 
     end 
    end 
    resources :sessions, :only => [:new, :create, :destroy] 
    resources :microposts, :only => [:create, :destroy] 
    resources :relationships, :only => [:create, :destroy] 

    match '/signup', :to => 'users#new' 
    match '/signin', :to => 'sessions#new' 
    match '/signout', :to => 'sessions#destroy' 
    match '/contact', :to => 'pages#contact' 
    match '/home', :to => 'pages#home' 
    match '/help', :to => 'pages#help' 
    match '/feedback', :to => 'pages#feedback' 
    match '/privacy', :to => 'pages#privacy' 
    match '/terms', :to => 'pages#terms' 
    match '/',  :to => 'pages#home' 

    resources :microposts 

    resources :users 
    resources :sessions, :only => [:new, :create, :destroy] 


    root :to => 'pages#home' 

    match "/auth/twitter/callback" => "sessions#omnicreate" 
    match "/auth/facebook/callback" => "sessions#omnicreate" 


end 

SessionsController

class SessionsController < ApplicationController 

    def new 
    @title = "Sign in" 
    end 

    def create 
     user = User.authenticate(params[:session][:email], 
          params[:session][:password]) 
     if user.nil? 
     flash.now[:error] = "Invalid email/password combination." 
     @title = "Sign in" 
     render 'new' 
     else 
     sign_in user 
     redirect_back_or user 
     end 
    end 

    def destroy 
     sign_out 
     redirect_to root_path 
    end 
end 

回答

1

看起來你需要做兩件事情:

改變你的路線這些行文件:

root :to => 'pages#home' 

    match "/auth/twitter/callback" => "sessions#omnicreate" 
    match "/auth/facebook/callback" => "sessions#omnicreate" 

要這樣:

match "/auth/:provider/callback" => "sessions#omnicreate" 

    root :to => 'pages#home' # this one should always be last 

Twitter和Facbook打算同樣的方法,所以你需要得到:provider以後才能找出它發送給它的Twitter或Facebook。

接下來你需要在你SessionsController接收這樣的回調來創建一個方法:

def omnicreate 

    data = request.env['omniauth.auth'] # here is all the user data 
    if params[:provider] == 'twitter' 
    #parse twitter data 
    elsif params[:provider] == 'facebook' 
    #parse fb data 
    else 
    # something is broken 
    redirect_to '/404.html' 
    end 

    user = User.create! #use data you parsed to create a user 
    redirect_to some_path, :notice => 'awwww yeah' 
end 

好運!

+0

感謝馬修我們跑了,並遇到了這個錯誤。我們收到了這個 'SessionsController#omnicreate'中的RecordInvalid' '驗證失敗:名稱不能爲空,電子郵件不能爲空,電子郵件無效,密碼太短(最少6個字符),密碼可能' t空白' – 2012-02-04 21:59:25

+0

我要添加我們的'SessionsController'快速瀏覽一下,讓我們知道你在想什麼 – 2012-02-04 22:01:22

+0

我的答案和評論的所有部分都是你需要填寫空白的地方。您需要解析'data'參數並使用結果將參數傳遞給'User.create!' – Matthew 2012-02-04 22:10:10

2

omniauth寶石是通過第三方服務來設置身份驗證的好方法。他們有一個Facebook戰略。我已經使用它,並且設置起來很簡單。只需要將你的api鍵放在軌道初始化器中。

+0

是的,我們使用OmniAuth,似乎無法使它工作。我們是否需要在用戶模型或控制器中進行修改? – 2012-02-04 19:45:49

+0

是的,你必須做一些改變。基本上,它的工作方式是將用戶重定向到Facebook,然後facecbook將它們重定向到您的站點並向您傳遞一些數據(例如auth令牌和他們的個人資料圖片的url)。 Omniauth會爲您解析這些數據並使其易於管理,但您需要爲用戶在Facebook.com上進行身份驗證後設置路由以重定向到該用戶。 tl; dr觀看此截屏視頻http://railscasts.com/episodes/235-omniauth-part-1 – Matthew 2012-02-04 20:40:30

+0

是的,這是我們的路由回調,完全出現故障。我們很好,直到Facebook將用戶重定向回我們的應用。我們得到錯誤'未知的行動''行動'omnicreate'無法找到SessionsController' – 2012-02-04 20:45:53

相關問題