设计Omniauth-facebook绕过rails验证

时间:2015-01-04 13:25:30

标签: ruby-on-rails validation ruby-on-rails-4 devise omniauth

我只是按照this article在我的rails 4 app中实现了omniauth。

在我的用户模型中,我有两种类型的用户,即ADMIN(由表单创建)和MEMBER(由omniauth创建)。我需要绕过将由omniauth创建的MEMBER用户的所有验证。

我知道这可以通过传递此选项来完成:

save(validate: false)

但是,采用了first_or_create方法:

  def self.from_omniauth(auth)
    # where(auth.slice(:provider, :uid)).first_or_create do |user|
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.email = auth.info.email
      user.password = Devise.friendly_token[0,20]
      user.name = auth.info.name   # assuming the user model has a name
      user.image = auth.info.image # assuming the user model has an image
    end
  end

所以,我的问题是:如何绕过这个omniauth案例中的所有验证?

请告知。

1 个答案:

答案 0 :(得分:4)

first_or_create似乎没有任何选择,但您仍有几个选项。

而不是first_or_create,您可以执行first_or_initialize,其工作方式与first_or_create相同但不保存。然后,您将有一条新记录,您可以在

上调用save(validate: false)

但是,你的系统中的记录无效,所以如果你去更新其中一条记录的电子邮件,你就必须再次绕过验证。

我建议将此逻辑转移到验证本身:

validate_presence_of :name, unless: -> { from_omniauth? }

private

def from_omniauth?
  provider && uid
end