Ошибка OmniAuth ActiveRecord при нажатии на Heroku - PullRequest
1 голос
/ 15 февраля 2012

У меня возникает странная ситуация, когда я могу читать и сохранять информацию из ответа Facebook через Omniauth при локальном запуске, но когда я отправляю точный код в 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>

Я использую термин «аквариумист» вместо пользователя ... Я знаю, что это не стандартное использование, но для моего случая использования это, кажется, имеет больше смысла. Я могу изменить это вовремя ...

Вот мой обратный звонок на Facebook от omniauth:

--- !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', чтобы убедиться, что столбцы базы данных выбираются в приложении.

Это моя запись OmniAuth в моем gemfile:

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:

$ 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?

1 Ответ

0 голосов
/ 18 июня 2012

Разобрался, что это было ... испорченный файл миграции. В какой-то момент я сделал (глупую) модификацию исходного файла миграции и правильно запустил его в своей среде разработки, но забыл отменить изменение онлайн.

Больше не буду, я мог бы сделать это примерно за 8 часов назад в моей жизни. :)

...