2015-06-30 138 views
3

我正在使用名爲omniauth-facebook的寶石,我成功實現了Facebook登錄驗證。爲什麼不在這種情況下調試工作?

它看起來不錯,但它不會將整個對象的數據傳遞給視圖。它只是說無。

當使用'debug'或'inspect'時它應該顯示一系列的東西。它以某種方式顯示session [:name]的內容。

控制器

class SessionsController < ApplicationController 
    def create 
     @auth = request.env["omniauth.auth"] 
     session[:oauth_token] = @auth.credentials.token 
     session[:username] = @auth.extra.raw_info.username 

     session[:name] = @auth.extra.raw_info.name 
     redirect_to bookd_url, :notice => "Signed in!" 
    end 
end 

查看

<% if signed_in? %> 
    <%= @auth.inspect %> 
    <%= debug @auth %><br /> 
    <%= session[:name] %> 
<% end %> 

輸出HTML

nil 
--- 
... 
John 
+1

'@ auth'的值是什麼? - 你可以嘗試在調試erb標籤之前放入'<%= @ auth.inspect%>'嗎? –

+0

@MaxWilliams感謝您的評論。它返回nil。 – HUSTEN

+0

這太奇怪了,因爲如果我在視圖中編碼'@ auth.extra.raw_info.name'它會返回正確的名稱。 – HUSTEN

回答

2

你創建控制器訴權n做重定向。重定向後,過程將從頭開始,@auth將不再被定義。如果此時渲染視圖,則@auth將爲零。這是你的問題。

你需要考慮你在這裏做什麼。您從初始請求中的認證詳細信息中設置一個@auth變量。然後,您可以使用它在會話中設置一些數據,例如記錄誰登錄。然後,在用戶登錄的下一頁上,您想查看@auth。這並沒有什麼意義:一旦你認證了一個用戶,你需要關心的是記住哪個用戶當前登錄了。你不需要存儲他們登錄的方式的詳細信息,事實上你很可能不應該。

而應該做這樣的事情:

#in ApplicationController, protected section 
protected 

def current_user 
    if @current_user 
    return @current_user 
    elsif session[:username] 
    @current_user = User.find_by_username(session[:username]) 
    return @current_user 
    end 
end 

這將允許你寫在你的控制器和視圖代碼current_user,訪問誰認證,原來的用戶,這是整個原因記錄有人在,並讓他們登錄。

+0

謝謝!我怎樣才能傳遞給視圖呢? – HUSTEN

+0

優秀的答案。非常感謝!! – HUSTEN

相關問題