【问题标题】:OmniAuth ActiveRecord error when pushing to Heroku推送到 Heroku 时出现 OmniAuth ActiveRecord 错误
【发布时间】:2012-02-15 12:01:47
【问题描述】:

我遇到了一种奇怪的情况,我可以在本地运行时通过 Omniauth 从 Facebook 响应中读取和保存信息,但是当我将确切的代码推送到 Heroku 时,出现了以下错误(来自我的日志) 关于 first_name 列。

Processing by AdminController#index as HTML
Rendered admin/list_users.html.erb within layouts/application (60.9ms)
Completed 500 Internal Server Error in 163ms

ActionView::Template::Error (undefined method `first_name' for #<Aquarist:0x00000001ee8>):
:       <td>Nickname: <%= aquarist.nickname %>
:     32:           Last: <%= aquarist.last_name %></td>
:     29:       <td><%= aquarist.name %></td>
:     31:           First: <%= aquarist.first_name %>
:     34:       <td><%= aquarist.email %></td>
:     28:       <td><%= image_tag(aquarist.image, :width => '20') %></td>
:     33:       <td><%= aquarist.provider %></td>

我使用术语“aquarist”代替用户...我知道这不是标准用法,但对于我的用例来说,它似乎更有意义。我可能会及时改回来...

这是来自omniauth 的我的Facebook 回调:

--- !ruby/hash:OmniAuth::AuthHash
provider: facebook
uid: '12456789'
info: !ruby/hash:OmniAuth::AuthHash::InfoHash
  email: my@email.address.com
  name: Alex
  first_name: Alex
  last_name: Lastname
  image: http://graph.facebook.com/123456789/picture?type=square
  urls: !ruby/hash:Hashie::Mash
    Facebook: http://www.facebook.com/profile.php?id=12456789
credentials: !ruby/hash:Hashie::Mash
  token: AACCCCb1i3ZALXEMfGxJtKZA
  expires_at: 13378794564
  expires: true
extra: !ruby/hash:Hashie::Mash
   raw_info: !ruby/hash:Hashie::Mash
     id: '12456789'
     name: Alex Lastname
     first_name: Alex
     last_name: Lastname
     link: http://www.facebook.com/profile.php?id=12456789
     gender: male
     email: my@email.address.com
     timezone: 11
     locale: en_US
     verified: true
     updated_time: '2012-02-01T12:51:00+0000'

如您所见,我已锁定我的 Facebook 个人资料,因此不要期望获得所有额外信息(例如关系状态等)。

我正在尝试为新用户(我的术语中的“鱼友”)建立一个基本资料,这将获取他们乐于从 facebook 分享的一些额外信息。

当我在本地执行此操作时,它工作正常,我可以收集我的名字、姓氏、性别和语言环境,并将其保存到数据库中。

这是我用来编写配置文件的代码

def self.create_with_omniauth(auth)
 create! do |aquarist|
   aquarist.provider        = auth["provider"]
   aquarist.uid             = auth["uid"]
   aquarist.name            = auth["info"]["name"]
   aquarist.nickname        = auth["info"]["nickname"]
   aquarist.email           = auth["info"]["email"]
   aquarist.image           = auth["info"]["image"]
   aquarist.first_name      = auth["extra"]["raw_info"]["first_name"] 
   aquarist.last_name       = auth["extra"]["raw_info"]["last_name"]
   aquarist.user_location   = auth["extra"]["raw_info"]["user_location"]
   aquarist.user_hometown   = auth["extra"]["raw_info"]["user_hometown"]
   aquarist.age             = auth["extra"]["raw_info"]["age"]
   aquarist.locale          = auth["extra"]["raw_info"]["locale"]
   aquarist.gender          = auth["extra"]["raw_info"]["gender"]
 end
end

然后我使用此代码显示此个人资料信息(在表格中):

<% @aquarists.each do |aquarist|%>
<tr class="tbody">
    <td><%= aquarist.uid %></td>
    <td><%= image_tag(aquarist.image, :width => '20') %></td>
    <td><%= aquarist.first_name %></td>
    ..and so on

当我推送此代码时,相同的信息会出现如上所述的活动记录错误。

但是,如果我从 [raw_info][extra] 部分中删除任何列,则代码可以在 Heroku 上运行(例如,全名、UID、提供程序等都保存到数据库中)。

让我完全困惑的是这段代码在本地工作 - 所以我收集到我正确地从“raw_info”部分请求数据。

我已经确认我已经在 Heroku 上运行了我的迁移,并且 - 正如其他一些问答所建议的那样 - 还使用了“heroku restart”来确保在应用程序中获取数据库列。

这是我的 gemfile 中的 OmniAuth 条目:

gem 'omniauth'
gem 'omniauth-twitter'
gem 'omniauth-facebook'

我在本地运行 Rails 3.1.3 和 postgres 9.1.2。我正在使用我认为运行 PG 8.x 的免费 Heroku 数据库。

以下是创建特定列的迁移文件的摘录:

def change
  add_column("aquarists", "first_name", :text, :default => "")
  add_column("aquarists", "last_name", :text, :default => "")
  add_column("aquarists", "gender", :text, :default => "")
  add_column("aquarists", "user_location", :text, :default => "")
  add_column("aquarists", "user_relationships", :text, :default => "")
  add_column("aquarists", "user_hometown", :text, :default => "")
  add_column("aquarists", "age", :integer)
  add_column("aquarists", "locale", :text, :default => "")
  add_column("aquarists", "image", :text, :default => "")
  add_column("aquarists", "timezone", :text, :default => "")
  add_column("aquarists", "last_login", :datetime)
end

这就是我运行 heroku 控制台时返回的结果:

$ heroku run console
Running console attached to terminal... up, run.1
Loading production environment (Rails 3.1.3)
irb(main):001:0> Aquarist.new
=> #<Aquarist id: nil, nickname: nil, name: nil, email: nil, created_at: nil, updated_at: nil, provider: nil, uid: nil, admin: false, age: nil, locale: "", image: "", timezone: "", last_login: nil, visits: nil>
irb(main):002:0> 

对我的代码运行 Heroku 时可能发生的情况有何看法?是 Postgres 版本问题吗?

【问题讨论】:

  • 如果您通过控制台检查 Aquarist 模型,您会看到什么。有这个专栏吗?
  • 不幸的是,我在使用免费版 heroku 时看不到实际的 PG 数据库。也就是说,我的向上/向下迁移在生产中运行良好,没有错误,因此我确信正在创建列。
  • 通过控制台查看。 heroku 运行控制台; Aquarist.new
  • 有趣!未创建列 - 我已在迁移文件中添加并来自 heroku 控制台。是不是我在迁移文件中使用“更改”而不是“向上”和“向下”?
  • 有些不对劲。你能重做那个迁移吗? heroku run rake db:migrate:redo(假设是最新的)

标签: ruby-on-rails postgresql heroku omniauth rails-postgresql


【解决方案1】:

弄清楚它是什么......一个拙劣的迁移文件。在某处,我对原始迁移文件进行了(愚蠢的)修改,并在我的开发环境中正确运行它,但忘记在线撤消更改。

不会再这样做了,我可以用我生命中的 8 个小时左右的时间来做。 :)

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多