2013-04-18 29 views
0

奇怪的問題 - 我的控制器之一中的創建動作未保存屬性 - 請查看下面的代碼。所有線路都工作到最後2. oauth_tokenoauth_expires_at未被保存。我檢查這些屬性都是正確的,等等。有趣的是,如果我改變倒數第二行:控制器未保存屬性(來自FB的Oauth令牌)

omniauth['credentials']['token'] ? provider = omniauth['credentials']['token'] : provider = ''

它完美的罰款。實際屬性oauth_tokenoauth_expires_at似乎有問題。然後我嘗試創建2個新的虛擬屬性,看看它是否會在那裏工作 - 不。看起來像oauth_token之後創建的任何屬性都搞砸了。這是一個遷移問題嗎?有任何想法嗎?

def create 
    params[:authorization] ? authorization_route = params[:authorization] : authorization_route = 'no authorization (invalid callback)' 

    omniauth = request.env["omniauth.auth"] 
    if omniauth and params[:authorization] 
     if authorization_route == "facebook" 
       omniauth['extra']['raw_info']['email'] ? email = omniauth['extra']['raw_info']['email'] : email = '' 
       omniauth['extra']['raw_info']['name'] ? name = omniauth['extra']['raw_info']['name'] : name = '' 
       omniauth['extra']['raw_info']['id'] ? uid = omniauth['extra']['raw_info']['id'] : uid = '' 
       omniauth['provider'] ? provider = omniauth['provider'] : provider = '' 
       omniauth['credentials']['token'] ? oauth_token = omniauth['credentials']['token'] : oauth_token = '' 
       omniauth['credentials']['expires_at'] ? oauth_expires_at = Time.at(omniauth['credentials']['expires_at']) : oauth_expires_at = '' 
end 
    end 

回答

1

我不知道如果這是你的問題,但我正在使用的三元路(condition ? value : other_value)語法是非典型的。通常情況下,你會喜歡寫東西

def create 
    authorization_route = params[:authorization] ? params[:authorization] : 'no authorization (invalid callback)' 

    omniauth = request.env["omniauth.auth"] 
    if omniauth and params[:authorization] 
    if authorization_route == "facebook" 
     email = omniauth['extra']['raw_info']['email'] ? omniauth['extra']['raw_info']['email'] : '' 
     name = omniauth['extra']['raw_info']['name'] ? omniauth['extra']['raw_info']['name'] : '' 
     uid = omniauth['extra']['raw_info']['id'] ? omniauth['extra']['raw_info']['id'] : '' 
     provider = omniauth['provider'] ? omniauth['provider'] : '' 
     oauth_token = omniauth['credentials']['token'] ? omniauth['credentials']['token'] : '' 
     oauth_expires_at = omniauth['credentials']['expires_at'] ? Time.at(omniauth['credentials']['expires_at']) : '' 
    end 
    end 
    # ... 
end 

但是,既然你正在使用這個來做attribute = value ? value : default,您可以通過使用或(||)運營商所有,但最後一個更加簡化它:

def create 
    authorization_route = params[:authorization] || 'no authorization (invalid callback)' 

    omniauth = request.env["omniauth.auth"] 
    if omniauth and params[:authorization] 
    if authorization_route == "facebook" 
     email = omniauth['extra']['raw_info']['email'] || '' 
     name = omniauth['extra']['raw_info']['name'] || '' 
     uid = omniauth['extra']['raw_info']['id'] || '' 
     provider = omniauth['provider'] || '' 
     oauth_token = omniauth['credentials']['token'] || '' 
     oauth_expires_at = omniauth['credentials']['expires_at'] ? Time.at(omniauth['credentials']['expires_at']) : '' 
    end 
    end 
    # ... 
end 

但是,所有這三種方法都可以正常工作,因此omniauth['credentials']['token']不是正確的散列鍵,或者在控制器或模型中的以後使用oauth_tokenoauth_expires_at時所做的任何操作都會導致問題。

你可以編輯你的問題,以包含來自控制器和用戶模型的更多代碼?

0

我不好意思承認的問題實際上是什麼:

完全忘了我是在控制器後面的工作。愛是愛粗心犯錯...

不得不改變:

user.authorizations.build(:provider => provider, :uid => uid, :name => name, :email => email, :user_id => user.id) 

到:

user.authorizations.build(:provider => provider, :uid => uid, :name => name, :email => email, :user_id => user.id, :oauth_token => oauth_token, :oauth_expires_at => oauth_expires_at)