我正在使用OAuth对我的应用进行身份验证,以使用OAuth访问用户的Facebook详细信息。最近,我迁移了数据库以使用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
任何帮助都非常感谢!
答案 0 :(得分:2)
postgres中的变量类型存在问题。如果您将'oauth_expires_at'作为'datetime',则应将字符串时间戳转换为日期时间。在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,你可以做这样的事情。当twitter或其他社交媒体中没有expires_at时,我正在使用rails的try方法来优雅地处理案例
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
答案 1 :(得分:1)
PG ::错误:错误:类型为timestamp的输入语法无效:“1350424800”
这里有一个nummeric Unix Timestamp值 - 而PostgreSQL数据类型timestamp
显然必须以另一种格式给出。
在这里看http://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-DATETIME-DATE-TABLE,你可以看到一些可接受的格式,但是那里似乎没有列出数字的Unix时间戳。
因此,您必须先将值转换/格式化为一种可接受的格式;在PostgreSQL中可能有一个设计用于执行此操作的功能...(如果没有,Google应该提供帮助)。