设计 Omniauth-facebook 绕过 rails 验证
Devise Omniauth-facebook bypass rails validations
我刚刚按照 this article 在我的 rails 4 应用程序中实施 omniauth。
在我的用户模型中,我有两种类型的用户,即 ADMIN(由 form 创建)和 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 案例中的所有验证?
请指教
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
我刚刚按照 this article 在我的 rails 4 应用程序中实施 omniauth。
在我的用户模型中,我有两种类型的用户,即 ADMIN(由 form 创建)和 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 案例中的所有验证?
请指教
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