Ruby on rails 使用omniauth+;时电子邮件验证失败;推特&x2B;设计

Ruby on rails 使用omniauth+;时电子邮件验证失败;推特&x2B;设计,ruby-on-rails,devise,omniauth,Ruby On Rails,Devise,Omniauth,我用的是这个代码,代码在 不幸的是,我得到了一个错误:您想要的更改被拒绝了。(讽刺的是,我已经实现了好几次,而且以前从未发生过这种情况) 在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.

我用的是这个代码,代码在

不幸的是,我得到了一个错误:
您想要的更改被拒绝了。
(讽刺的是,我已经实现了好几次,而且以前从未发生过这种情况)

在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\u回调中使用它吗?

我建议添加这样的迁移

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

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

我建议添加这样的迁移

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
但如果您仍然想从用户那里获取电子邮件地址,则需要添加第二个注册步骤来实现此目的。

最后我终于找到了答案 使用
where(auth.slice(:provider,:uid))。首先_或_初始化do | user |
要替换
where(auth.slice(:provider,:uid))。请首先创建do | user |
然后删除
save在块中

我终于找到了答案 使用
where(auth.slice(:provider,:uid))。首先_或_初始化do | user |
要替换
where(auth.slice(:provider,:uid))。请首先创建do | user |


然后删除
save在块中

生成的设计迁移在电子邮件列中添加了NOTNULL和unique,可能是这样吗?是的,我有。因此,这将阻止
.save?
但在我的一个订单中。我还收到了这个
t.string:email,:null=>false,:default=>“
当时它工作正常。是的,我想会的。我还记得,在上一个项目之前,我从来没有遇到过这个问题,所以我认为这可能是Devage中的一个回归。哈哈,你也遇到了同样的问题。那个么我该怎么处理呢?生成的设计迁移在电子邮件列上添加了非空和唯一,也许是这样?是的,我有。因此,这将阻止
.save?
但在我的一个订单中。我还收到了这个
t.string:email,:null=>false,:default=>“
当时它工作正常。是的,我想会的。我还记得,在上一个项目之前,我从来没有遇到过这个问题,所以我认为这可能是Devage中的一个回归。哈哈,你也遇到了同样的问题。那我该怎么处理呢?只有在电子邮件上才有唯一的索引。如果愿意,您可以添加常规索引,更新应答器,但这会对想要注册该网站的人产生什么影响?因此,我们需要在用户模型中添加电子邮件验证语句?是的,您需要为以常规方式(使用电子邮件和密码)注册的用户验证电子邮件。。我尝试添加验证。它仍然报告
ActiveRecord::RecordInvalid(验证失败:电子邮件不能为空,电子邮件不能为空)
def Email\u需要吗?super&&provider.blank?
正在工作,但我们不再收到电子邮件……只有电子邮件上有唯一索引。如果愿意,您可以添加常规索引,更新应答器,但这会对想要注册该网站的人产生什么影响?因此,我们需要在用户模型中添加电子邮件验证语句?是的,您需要为以常规方式(使用电子邮件和密码)注册的用户验证电子邮件。。我尝试添加验证。它仍然报告
ActiveRecord::RecordInvalid(验证失败:电子邮件不能为空,电子邮件不能为空)
def Email\u需要吗?super&&provider.blank?
正在工作,但我们再也没有收到电子邮件。。。。。。