1

OAuth を使用してアプリを認証し、OAuth を使用してユーザーの Facebook の詳細にアクセスするために OAuth を使用しています。最近、PostgreSQL を使用するようにデータベースを移行しましたが、Facebook から返されたときにトークン情報を保存する際に問題が発生しています。

正確なエラーは次のとおりです。

PG::Error: ERROR:  invalid input syntax for type timestamp: "1350424800"
: INSERT INTO "authentications" ("created_at", "oauth_expires_at", "oauth_token", "provider", "uid", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"

奇妙なことに、これは SQLite には当てはまらないため、Facebook が有効期限を返す形式 ("1350424800") に関係していることは明らかです。これを機能させるためにどのように解析する必要があるかについて何か考えはありますか?

私は現在、それが作成された方法で巧妙なことをしていません。単純に:

def self.create_with_omniauth(auth)
    create(uid: auth['uid'], provider: auth['provider'], oauth_token: auth['credentials'].token, oauth_expires_at: auth['credentials'].expires_at)
end

どんな助けでも大歓迎です!

4

2 に答える 2

2

postgres の変数の型に問題があります。「日時」として「oauth_expires_at」がある場合は、文字列のタイムスタンプを日時に変換する必要があります。Rails では、次のように Time.at で簡単に変換できます。

... oauth_expires_at: Time.at(auth['credentials'].expires_at)

関数を次のように書き換えます。

def self.create_with_omniauth(auth)
    create(uid: auth['uid'], provider: auth['provider'], oauth_token: auth['credentials'].token, oauth_expires_at: Time.at(auth['credentials'].expires_at))
end

さらに柔軟性が必要で、omniauth-twitter でも使用する場合は、次のようにします。レールの try メソッドを使用して、Twitter やその他のソーシャル メディアに expires_at がない場合を適切に処理しています。

class User < ActiveRecord::Base
    has_many :authentications, dependent: :destroy

    def create_authentication(oauth)
        authentications.create!(
            provider: oauth['provider'], 
            uid: oauth['uid'], 
            oauth_token: oauth['credentials']['token'],
            oauth_secret: oauth['credentials'].try(:[],'secret'),
            oauth_token_expires_at: oauth['credentials'].try(:[],'expires_at') ? Time.at(oauth['credentials'].try(:[],'expires_at')) : nil,
            data: oauth.to_json.to_s
        )
    end 
end
于 2012-10-16T20:50:16.893 に答える
1

PG::エラー: エラー: タイプ タイムスタンプの無効な入力構文: "1350424800"

ここには数値の Unix タイムスタンプ値がありますが、PostgreSQL のデータ型timestampは明らかに別の形式で指定する必要があります。

ここhttp://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-DATETIME-DATE-TABLEを見ると、受け入れられている形式の一部が表示されますが、数値の Unix タイムスタンプは表示されませんそこに記載されます。

そのため、最初に値を受け入れられた形式のいずれかに変換/フォーマットする必要があります。PostgreSQL でこれを行うように設計された関数があるかもしれません … (ない場合は、Google が助けてくれるはずです)。

于 2012-10-16T20:28:28.133 に答える