1

我正在使用这个Railcast 剧集中的代码,代码在Github中。

不幸的是,我得到了错误:(The change you wanted was rejected.具有讽刺意味的是,我已经实现了好几次,而且以前从未发生过)

在 Heroku 的日志中,我得到:

    2013-07-13T09:06:49.096663+00:00 app[web.1]: Completed 422 Unprocessable Entityin 83ms
    2013-07-13T09:06:49.099178+00:00 app[web.1]:
    2013-07-13T09:06:49.099178+00:00 app[web.1]: ActiveRecord::RecordInvalid (Validation failed: Email can't be blank):
   2013-07-13T09:06:49.099178+00:00 app[web.1]:   app/models/user.rb:14:in `from_omniauth'
    2013-07-13T09:06:49.099178+00:00 app[web.1]:
    2013-07-13T09:06:49.099178+00:00 app[web.1]:
    2013-07-13T09:06:49.099178+00:00 app[web.1]:   app/models/user.rb:20:in `block in from_omniauth'
   2013-07-13T09:06:49.099178+00:00 app[web.1]:   app/controllers/omniauth_callbacks_controller.rb:3:in `all'

我认为这是电子邮件验证失败造成的错误。由于在我的from_omniauth方法中,我不检索电子邮件。

  def self.from_omniauth(auth)
    where(auth.slice(:provider, :uid)).first_or_create do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.nickname
      user.image = auth.info.image
      user.save!
    end
  end

验证失败是否会阻止user.save!?我以后不能在omniauth_callbacks 中使用它吗?

4

2 回答 2

1

我建议添加这样的迁移

remove_index :users, :email
change_column :users, :email, default: nil, allow_null: true

如果您希望在电子邮件上保留索引以进行快速查找,还请添加

add_index :users, :email # this index will be simple btree in postgres, not uniq

在您的用户模型上添加此方法

def email_required?
  provider.blank?
end

但是,如果您仍想从用户那里获取电子邮件地址,则需要添加第二个注册步骤才能这样做。

于 2013-07-13T10:04:06.280 回答
0

最后我弄清楚它where(auth.slice(:provider, :uid)).first_or_initialize do |user| 用于替换where(auth.slice(:provider, :uid)).first_or_create do |user| 和删除save!

于 2013-07-22T04:31:11.203 回答