The*_*ner 1 validation ruby-on-rails devise omniauth ruby-on-rails-4
我刚刚按照这篇文章在我的Rails 4应用程序中实现omniauth。
在我的用户模型中,我有两种类型的用户,即ADMIN(由表单创建)和MEMBER(由omniauth创建)。我需要绕过将由omniauth创建的MEMBER用户的所有验证。
我知道可以通过传递此选项来完成:
save(validate: false)
Run Code Online (Sandbox Code Playgroud)
但是,采用了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
Run Code Online (Sandbox Code Playgroud)
因此,我的问题是:在这种omniauth情况下,如何绕过所有验证?
请指教。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |