Ruby OmniAuth触发验证

Ruby OmniAuth触发验证,ruby,facebook,authentication,twitter,omniauth,Ruby,Facebook,Authentication,Twitter,Omniauth,我在需要身份验证的应用程序中使用OmniAuth 我有3种方式供用户进行身份验证: 在我的网站上创建帐户 通过OmniAuth的Facebook 通过OmniAuth发布Twitter 对于选项1,我有以下形式的验证: validates_presence_of :email, :role validates_presence_of :password, :if => :password_required validates_

我在需要身份验证的应用程序中使用OmniAuth

我有3种方式供用户进行身份验证:

  • 在我的网站上创建帐户
  • 通过OmniAuth的Facebook
  • 通过OmniAuth发布Twitter
  • 对于选项1,我有以下形式的验证:

      validates_presence_of     :email, :role
      validates_presence_of     :password,                   :if => :password_required
      validates_presence_of     :password_confirmation,      :if => :password_required
      validates_length_of       :password, :within => 4..40, :if => :password_required
      validates_confirmation_of :password,                   :if => :password_required
      validates_length_of       :email,    :within => 3..100
      validates_uniqueness_of   :email,    :case_sensitive => false
      validates_format_of       :email,    :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
      validates_format_of       :role,     :with => /[A-Za-z]/
    
    问题是,当我第一次允许用户通过twitter/facebook登录帐户时,会触发验证并失败

    例如:

    ActiveRecord::RecordInvalid-验证失败:密码不能为空,密码太短(至少4个字符),密码确认不能为空:

    这是有道理的,因为OmniAuth创建的帐户将不会提交密码,但我不确定应该如何让我的模型知道这一点并跳过(特定的?)验证

    如果有任何用处,则完整account.rb模型如下:


    非常感谢

    尝试从这里将条件提取到加密\u密码方法中,此行似乎不正确:

      # Callbacks
      before_save :encrypt_password, :if => :password_required
    

    你也可以复制粘贴堆栈跟踪吗?

    我找到了一种解决方法,但我认为这是一种黑客行为。我对这个方法做了一个补充(如上面的粘贴所示)。