Обновлено до 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 ответ:
Я заглянул в 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?
, что может вызвать проблемы в будущем, поскольку метод "заглушен".