2016-08-18 8 views
0

同様の質問hereがあるようですが、誰もそれに答えられませんでした。それはまた、少し異なるようです。update_with_passwordを使用してRails 5セキュリティ拡張エラーを作成する

私は、レール4.2.4からレール5.0.0.1にアップグレードしています。 私は30日後にパスワードの有効期限を実行しようとすると、それは問題は二行目で発生した更新アクションを通過:

def update 
    resource.extend(Devise::Models::DatabaseAuthenticatablePatch) 
    if resource.update_with_password(resource_params) 
    warden.session(scope)['password_expired'] = false 
    set_flash_message :notice, :updated 
    sign_in scope, resource, :bypass => true 
    redirect_to stored_location_for(scope) || :root 
    else 
    clean_up_passwords(resource) 
    respond_with(resource, action: :show) 
    end 
end 

そしてここでは、RANを取得し、そのモジュールです:

module Devise 
    module Models 
    module DatabaseAuthenticatablePatch 
     def update_with_password(params, *options) 

     new_password = params[:password] 
     new_password_confirmation = params[:password_confirmation] 

     result = if new_password.present? && new_password_confirmation.present? 
        update_attributes(params, *options) 
       else 
        self.assign_attributes(params, *options) 
        self.valid? 
        self.errors.add(:password, new_password.blank? ? :blank : :invalid) 
        self.errors.add(:password_confirmation, new_password_confirmation.blank? ? :blank : :invalid) 
        false 
       end 

     clean_up_passwords 
     result 
     end 
    end 
    end 
end 

ヒットするとエラーが発生するupdate_attributes(params, *options)

このエラーが発生します。

undefined method `<<' for #<OldPassword::ActiveRecord_AssociationRelation:0x007ffe59a0ffa0> 

誰かが私にこのことを理解させることができれば、それはすばらしいでしょう。

ありがとうございます。

答えて

3

問題はdevise_security_extension gemでした。 私はpassword_archivableを使用しています。そのモジュールでは、変更パスワードをテーブルに追加できるように、old_passwordオブジェクトを配列に変換する必要がありました。

私はpassword_archivable.rbを作成し、初期化子に入れました。

module Devise 
    module Models 
    # PasswordArchivable 
    module PasswordArchivable 
     # validate is the password used in the past 
     def password_archive_included? 
     unless self.class.deny_old_passwords.is_a? Fixnum 
      if self.class.deny_old_passwords.is_a? TrueClass and archive_count > 0 
      self.class.deny_old_passwords = archive_count 
      else 
      self.class.deny_old_passwords = 0 
      end 
     end 
     if self.class.deny_old_passwords > 0 and not self.password.nil? 
      old_passwords_including_cur_change = self.old_passwords.order(:id).reverse_order.limit(self.class.deny_old_passwords).to_a 
      old_passwords_including_cur_change << OldPassword.new(old_password_params) # include most recent change in list, but don't save it yet! 
      old_passwords_including_cur_change.each do |old_password| 
      dummy     = self.class.new 
      dummy.encrypted_password = old_password.encrypted_password 
      dummy.password_salt  = old_password.password_salt if dummy.respond_to?(:password_salt) 
      return true if dummy.valid_password?(self.password) 
      end 
     end 
     false 
     end 
    end 
    end 
end 

これは唯一の問題でした。

これは他の人に役立つことを願っています。

関連する問題