2012-12-13 23 views
1

我正在使用omniauth讓用戶使用Ruby on Rails應用程序中的Facebook和Twitter帳戶登錄。由於Twitter request.env["omniauth.auth"]沒有給我帳戶的電子郵件,我構建它(數據庫中的電子郵件不能爲NULL)。我有這段代碼:omitiuth和twitter SQLite錯誤

if params[:provider] == 'facebook' 
       email = omniauth[:info]["email"] 
elsif params[:provider] == 'twitter' 
       email = omniauth[:info]["name"] + '@example.com' 
end 
user = User.new(:email => email) 

如果我使用Facebook帳戶登錄,它的工作原理非常完美。但是,如果我嘗試使用Twitter帳戶的applicacion給了我這個錯誤:

SQLite3::ConstraintException: users.email may not be NULL [SQL query] 

我檢查郵件是否爲NULL幾次情況下,它被嚴重建造或東西,但不爲NULL。已安裝omniauth-twitteromniauth-facebook寶石。 有誰知道爲什麼? 讓我知道你是否需要更多的代碼或信息。

回答

0

我不喜歡這些方法的任何誠實。名稱不是唯一約束,Twitter用戶可以隨時更改他的暱稱。如果用戶更改了他的暱稱,會發生什麼情況?他將不能再訪問他的賬戶嗎?如果另一個人將他的暱稱改爲現在可用的暱稱呢?他能夠訪問其他用戶的帳戶嗎?

兩個更好的解決方案是,要麼:

  1. 按照Ryan Bates's approach和用戶重定向到一個表單,在那裏他可以輸入自己的電子郵件。或者

  2. 改寫設計的方法email_required?。例如:

    # user.rb 
    def email_required? 
        authentications.empty? 
    end 
    

    這樣你就不會在登錄過程中引入額外的步驟。

+0

我試過了_Ryan Bate的方法_但我得到了同樣的結果。我想我在某個地方錯過了一些東西,但我看不到它。我會再試一次,我會告訴你我的結果。 – itziki

+0

我終於成功地使用Twitter帳戶登錄,並試圖重定向,以便用戶鍵入他的電子郵件。我更喜歡那個解決方案,而不是另一個:)謝謝你們兩個 – itziki

0

Twitter不會將電子郵件地址作爲OAuth握手的一部分發回。您將不得不生成一個或將它們發送到另一個註冊頁面,臨時存儲他們的Twitter授權信息以預先填充註冊字段。

看起來您正試圖根據用戶的名稱生成電子郵件地址。 Twitter以「FirstName LastName」的形式將其發回,因此如果您有任何電子郵件地址驗證,他們將不會以「FirstName [email protected]」的形式接受電子郵件地址。我可以建議你用"#{omniauth[:info][:nickname]}@twitter.com"代替嗎?這樣,您也可以防止重複的電子郵件地址,因爲Twitter用戶名是唯一的。