2011-04-26 40 views
5

我正在使用twitter的gem。在回調中,檢查用戶是否存在並創建他或將他發回主頁。
我可能會做錯某事,但在我的回調代碼中,request.env ['omniauth.origin']的零無效Omniauth - Origin is nil

我的代碼非常簡單:
whatever.html.erb

<%= link_to image_tag("twitter-connect.png"), "/auth/twitter" %> 

的routes.rb

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

sessions_controller.rb

def create 
    auth = request.env["omniauth.auth"] 
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth) 
    if !user.email 
     redirect_to confirm_path, :notice => "Add your email!" 
    else 
     redirect_to request.env['omniauth.origin'] || root_url, :notice => "Signed in!" 
    end 
end 

如果我提出request.env ['omniauth.origin']在回調後,我得到一個對象。

感謝您的幫助!

+0

您正在使用哪個版本的omniauth? – 2011-04-26 16:23:08

+0

我問,因爲,我認爲新版本的omniauth存在與此相關的問題。 – 2011-04-26 16:34:49

+0

HI Aditya。我剛剛在0.2.4上更新了最新版本。 – Laurent 2011-04-26 17:34:02

回答

0

嘗試版本0.2.0 - 我已經能夠讓這個版本在Rails 3.0.9和Ruby 1.9.2-p180沒有任何問題的情況下工作。

  1. 不應該您的線以上讀作

    用戶= auth.find_by_provider_and_uid(AUTH [ 「提供者」],AUTH [ 「UID」])|| User.create_with_omniauth(auth)

  2. 至於omniauth.originnil,參見this discussion

+0

嗨邁克,thx的方向。 關於1),不知道=>我試圖找到一個用戶在auth中的信息,並創建他,如果我沒有找到他。 – Laurent 2011-06-23 07:33:58

+0

嗯,我的觀點是你不能'User.find_by_provider_and_uid'因爲User模型沒有提供者/ uid字段;最後我檢查了'find_by_ *'動態查找器,可以僅指定該特定模型的屬性。另一方面,您可以檢查當前auth是否有關聯的用戶,即'如果current_user == auth.user'。看看我使用的邏輯[這裏](https://github.com/bsodmike/omniauth_scratch/blob/50d9e9ca37dae1c69818a0454e301178ff3e0759/app/controllers/authentications_controller。RB);我採取了'如果current_user &&認證'的方法。 – 2011-06-23 08:16:04

0

您需要手動設置的原點在視圖中的鏈接。在Rails 4中,request.original_url是最好的方法。

在你的link_to Twitter的按鈕,可以手動設置的原點:

"/auth/twitter?origin=#{request.original_url}" 
在SessionsController

然後,當你重定向到request.env [ 'omniauth.origin'],它應該正常工作。