2017-10-11 19 views
1

パスワードリセット処理中に郵便番号の検証をスキップする必要があります。これまでに私が書いたことは以下の通りです。パスワードのリセット - 検証のスキップ

User.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 

アプリ/ビュー/工夫/パスワード/ edit.html.erb

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

しかし、私はまだ取得していますパスワードリセット時に郵便番号検証エラーが発生しました。 デバッグ時に、skip_zip_validation属性がnilとして表示されます。属性がユーザーに割り当てられていないようです。

これを修正する方法はありますか?

答えて

0

devise 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 
0

: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 
+0

私は既にそれを追加しました。更新された質問をご覧ください。 – prajeesh

+0

1つのデバッグで、skip_zip_validation属性がnilとして表示されています – prajeesh

関連する問題