2012-02-04 64 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

相关问题