2014-04-06 58 views
0

我正在使用Devise + Omniauth在我的應用程序中啓用Facebook註冊。當我開發它時,我沒有遇到任何問題。將它部署到我的遠程服務器也一樣。問題是,其他人保持遇到了同樣的錯誤:Devise + OmniAuth for Facebook在遠程服務器上註冊

TypeError (no implicit conversion of Symbol into Integer): 
app/models/user.rb:67:in `find_for_facebook_oauth' 
app/controllers/users/omniauth_callbacks_controller.rb:4:in `facebook' 

我對用戶模型user.rb下面的代碼:

def self.find_for_facebook_oauth(data, signed_in_resource=nil) 
user = User.where(:email => data.info.email).first 
unless user 
    params = 
    { 
     :user => 
     { 
     :username => data.uid, 
     :email => data.info.email, 
     :password => Devise.friendly_token[0,20], 
     :user_profile_attributes => 
      { 
      :first_name => data.extra.raw_info.first_name, 
      :last_name => data.extra.raw_info.last_name, 
      :remote_image_url => data.extra.raw_info.image, 
      }, 
     :user_auths_attributes => 
     { 
      :uid => data.uid, 
      :provider => data.provider 
     } 
     } 
    } 
    user = User.create!(params[:user]) 
end 
return user 
end 

其中線67是user = User.create!(params[:user])

而且omniauth_callbacks_controller.rb

def facebook 
# You need to implement the method below in your model (e.g. app/models/user.rb) 
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"]) 

if @user.persisted? 
    sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
    set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
else 
    session["devise.facebook_data"] = request.env["omniauth.auth"] 
    redirect_to new_user_registration_url 
end 
end 

第4行i小號@user = User.find_for_facebook_oauth(request.env["omniauth.auth"])

服務器日誌還示出了GET參數:

Parameters: {"code"=>"[some long string of number and letters]", "state"=>"[another string of numbers and letters]"} 

更新: 記錄器輸出下列爲request.env["omniauth.auth"]

#<OmniAuth::AuthHash credentials=#<OmniAuth::AuthHash expires=true expires_at=1401992074 token="*"> extra=#<OmniAuth::AuthHash raw_info=#<OmniAuth::AuthHash email="*" first_name="*" gender="male" id="*" last_name="*" link="https://www.facebook.com/*" locale="en_US" name="*" timezone=8 updated_time="2014-04-05T09:29:22+0000" username="*" verified=true>> info=#<OmniAuth::AuthHash::InfoHash email="*" first_name="*" image="http://graph.facebook.com/*/picture?type=square" last_name="*" name="*" nickname="*" urls=#<OmniAuth::AuthHash Facebook="https://www.facebook.com/*"> verified=true> provider="facebook" uid="*"> 

更新2: 記錄的PARAMS [:用戶]提供以下值:

Params: {:username=>"*", :email=>"*", :password=>"iePVLt7XEWk4YwPjja6n", :user_profile_attributes=>{:first_name=>"*", :last_name=>"*", :remote_image_url=>"http://graph.facebook.com/*/picture?type=square"}, :user_auths_attributes=>{:uid=>"*", :provider=>"facebook"}} 
+0

請在方法'find_for_facebook_oauth'中的用戶記錄器中查找數據參數並將其粘貼到此處(使用'*'輸入令牌和電子郵件...)。 – LuiGi

+0

這裏是數據參數。如果你不介意的話,我冒昧地刪除了用戶的名字和用戶名。 –

回答

0

更新您的PARAMS哈希如下:

params = 
    { 
     :user => 
     { 
     :username => data.uid, 
     :email => data.info.email, 
     :password => Devise.friendly_token[0,20], 
     :user_profile_attributes => 
      { 
      :first_name => data.extra.raw_info.first_name, 
      :last_name => data.extra.raw_info.last_name, 
      :remote_image_url => data.info.image ## Removed comma and updated the method 
      }, 
     :user_auths_attributes => 
     [{ 
      :uid => data.uid, 
      :provider => data.provider 
     }] ## Enclosed within array [] brackets 
     } 
    } 

看着被你給params哈希表,我可以告訴大家,一個UserProfile1-1 RelationshipUserAuths1-M Relationship。在這種情況下,user_auths_attributes必須作爲Array傳遞。

TypeError (no implicit conversion of Symbol into Integer)

你都拿到上面的錯誤,因爲user_auths_attributes正在解釋爲一個數組,而不是一個哈希值。所以當Ruby看到params [:user] [:user_auths_attributes] [:uid]它試圖取最後一個鍵並將其變成params [:user] [:user_auths_attributes] [0]或至少找到一些整數值可以轉換爲索引數組。

+0

非常感謝這個答案,它終於奏效了,雖然我現在遇到了關於保存用戶配置文件映像的驗證的另一個錯誤。 –

+0

很高興幫助您:)您可以發佈另一個問題與相關數據以及錯誤日誌,所以其他一些專家也可以幫助您。 –

0

我只發現了這個問題:

:remote_image_url => data.extra.raw_info.image # In data I see only data.info.image 

更換

:remote_image_url => data.info.image 

但它不是你的問題的解決方案。

嘗試從params[:user]調試數據。從異常看來,你使用一些散列屬性是整數。

+0

我將代碼更改爲您的建議,並添加了params [:user]的記錄器生成的值,但未找到任何可疑值。 –

+0

嘗試從控制檯調用 \t \t User.create({:用戶名=> 「測試」,:電子郵件=> 「[email protected]」:密碼=> 「iePVLt7XEWk4YwPjja6n」:user_profile_attributes => {:FIRST_NAME =>「test」,:last_name =>「test lastname」,:remote_image_url =>「http://graph.facebook.com/*/picture?type=square」},:user_auths_attributes => {:uid =>「 1234567「,:provider =>」facebook「}})或者寫測試。你如何處理'user_profile_attributes'和'user_auths_attributes'?在調試時嘗試刪除所有額外的參數,然後增加它並找到錯誤。 – LuiGi

相關問題