【问题标题】:Reset Password - Skip validation重置密码 - 跳过验证
【发布时间】:2017-10-11 07:25:16
【问题描述】:

我需要在密码重置操作期间跳过邮政编码验证。目前我写的内容如下。

用户.rb

attr_accessor :email_confirmation, :user_role, :unit_user_property,
            :skip_validation, :skip_zip_validation, :login

validates_format_of :zip,
                  with: /\A\d{5}-\d{4}|\A\d{5}\z/,
                  message: 'should be of the format 12345 or 12345-1234',
                  unless: :skip_zipcode_validation?

# Return true/false to validate zipcode
# Skips validation if this returns true
def skip_zipcode_validation?
  skip_validation.present? || skip_zip_validation.present?
end

application_controller.rb

before_action :configure_permitted_parameters, if: :devise_controller?

protected



  def configure_permitted_parameters
    added_attrs = [:phone, :email, :password, :password_confirmation, :remember_me, :skip_zip_validation]

    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(added_attrs) }
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(added_attrs) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(added_attrs) }
  end

app/views/devise/passwords/edit.html.erb

<%= f.hidden_field :skip_zip_validation, value: true %>

但我仍然在密码重置时收到邮政编码验证错误。 在调试时,属性 skip_zip_validation 显示为 nil。看起来该属性没有分配给用户

关于如何解决这个问题的任何想法?

【问题讨论】:

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


    【解决方案1】:

    确保 :skip_zip_validation 作为允许的参数传递。

    class ApplicationController < ActionController::Base
      before_action :configure_permitted_parameters, if: :devise_controller?
    
      def configure_permitted_parameters
        update_attrs = [:password, :password_confirmation, :current_password:, :skip_zip_validation]
        devise_parameter_sanitizer.permit :account_update, keys: update_attrs
      end
    end
    

    【讨论】:

    • 一次调试,属性skip_zip_validation显示为nil
    【解决方案2】:

    通过覆盖设计 reset_password_by_token 方法设法解决了这个问题。

    def self.reset_password_by_token(attributes={})
      original_token       = attributes[:reset_password_token]
      reset_password_token = Devise.token_generator.digest(self, :reset_password_token, original_token)
    
      recoverable = find_or_initialize_with_error_by(:reset_password_token, reset_password_token)
      recoverable.skip_zip_validation = true
        if recoverable.persisted?
          if recoverable.reset_password_period_valid?
            recoverable.reset_password(attributes[:password], attributes[:password_confirmation])
          else
            recoverable.errors.add(:reset_password_token, :expired)
          end
        end
    
      recoverable.reset_password_token = original_token if 
      recoverable.reset_password_token.present?
      recoverable
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多