我遇到了一个奇怪的情况,在本地运行时,我可以通过 Omniauth 从 Facebook 响应中读取和保存信息,但是当我将确切的代码推送到 Heroku 时,会出现以下错误(来 self 的日志) 关于 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。我正在使用免费的 Heroku 数据库,我相信它运行 PG 8.x。
这是创建特定列的迁移文件的摘录:
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 console 时返回的结果:
$ 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 版本问题吗?
最佳答案
找出它是什么……一个拙劣的迁移文件。在某处,我对原始迁移文件进行了(愚蠢的)修改,并在我的开发环境中正确运行了它,但忘记在线撤消更改。
不会再这样做了,我可以用我生命中的 8 个小时左右的时间来做。 :)
关于ruby-on-rails - 推送到 Heroku 时出现 OmniAuth ActiveRecord 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9292984/