Обновлено до Rails 4.2.2 и получил: электронная почта пользователя изменилась? метод не найден


Я только что обновился до rails 4.2.2 и больше не могу создать пользователя. (это работало и раньше).

У меня есть электронная почта пользователя , делегированная другой модели, такой как эта:

class User < ActiveRecord::Base
  devise :database_authenticatable, :recoverable, :rememberable

  ...
  belongs_to :contact, :inverse_of => :user
  delegate :name, :email, :to => :contact, :allow_nil => true

  # Validations
  ...

end

Теперь, когда я пытаюсь создать пользователя, я получаю следующую ошибку:

NoMethodError: undefined method `email_changed?' for #<User:0xddb3be0>
from /home/.../gems/activemodel-4.2.2/lib/active_model/attribute_methods.rb:433:in `method_missing'

Если я добавлю это в пользователя.rb , он снова работает:

def email_changed?
  false
end

Есть ли какие-либо проблемы с этим решением? Есть ли лучшая альтернатива?

Obs:

В более полном журнале, I получил следующие строки:

NoMethodError:
       undefined method `email_changed?' for #<User:0xf75da14>
     # /home/.../gems/activemodel-4.2.2/lib/active_model/attribute_methods.rb:433:in `method_missing'
     # /home/.../gems/devise-3.5.1/lib/devise/models/recoverable.rb:35:in `block (2 levels) in <module:Recoverable>'
     # /home/.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:446:in `instance_exec'
     # /home/.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:446:in `block in make_lambda'
     # /home/.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:164:in `call'
     # /home.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:164:in `block in halting'
     # /home/.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:504:in `call'
     # /home/.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:504:in `block in call'
     # /home/.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:504:in `each'
     # /home/.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:504:in `call'
     # /home/.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:92:in `_run_callbacks'
     # /home/.../gems/activesupport-4.2.2/lib/active_support/callbacks.rb:776:in `_run_save_callbacks'
     # /home/.../gems/activerecord-4.2.2/lib/active_record/callbacks.rb:302:in `create_or_update'
     # /home/.../gems/activerecord-4.2.2/lib/active_record/persistence.rb:142:in `save!'
     ...

Есть ли что-то общее с модулем Devise :recoverable? (используя устройства 3.5.1)

1 2

1 ответ:

Я заглянул в devise gem , восстанавливаемый модуль, и нашел это :

included do
  before_update :clear_reset_password_token, if: :encrypted_password_changed?
  before_save do
    if email_changed? || encrypted_password_changed?
      clear_reset_password_token
    end
  end
end

Он был включен этим коммитом. Он очищает reset_password_token , если электронная почта пользователя изменилась правильно.

В моем конкретном случае пользователь не имеет возможности изменить свою электронную почту, и электронная почта была делегирована другой модели. Он может только изменить свой пароль.

Поскольку это странный случай использования, он не кажется таким уж плохим добавление к пользователю.РБ это:

def email_changed?
  false
end

Существует проблема с этим решением, если некоторые другие важные проверки электронной почты добавляются разработчиком с использованием метода email_changed?, что может вызвать проблемы в будущем, поскольку метод "заглушен".