Использование Sorcery 0.7.4 с Rails 3.1.1 для аутентификации.Все шло хорошо, пока я не попытался настроить сброс пароля.
Активация работает отлично и письма отправляются, но по какой-то причине я получаю эту ошибку при попытке отправить электронное письмо с паролем сброса.
undefined method `reset_password_email' for nil:NilClass
Я точно скопировал учебник, и когда я провел быстрый тест в консоли, он, как и ожидалось, отбросил письмо.В консоли:
user = User.find(1)
user.deliver_reset_password_instructions!
В реальном контроллере он находит пользователя по электронной почте, отправленной из формы, и в журнале я вижу, что он выбирает нужного пользователя и устанавливает токен, но выдает ошибки каквыше и откатывается.
Я проверил код драгоценного камня для delivery_reset_password_instructions!и, похоже, нет причин для его сбоя.
PasswordResetsController:
@user = User.find_by_email(params[:email])
@user.deliver_reset_password_instructions! if @user
Следующее скопировано из кода gem:
Instance Method in Gem:
def deliver_reset_password_instructions!
config = sorcery_config
# hammering protection
return false if config.reset_password_time_between_emails && self.send(config.reset_password_email_sent_at_attribute_name) && self.send(config.reset_password_email_sent_at_attribute_name) > config.reset_password_time_between_emails.ago.utc
self.send(:"#{config.reset_password_token_attribute_name}=", TemporaryToken.generate_random_token)
self.send(:"#{config.reset_password_token_expires_at_attribute_name}=", Time.now.in_time_zone + config.reset_password_expiration_period) if config.reset_password_expiration_period
self.send(:"#{config.reset_password_email_sent_at_attribute_name}=", Time.now.in_time_zone)
self.class.transaction do
self.save!(:validate => false)
generic_send_email(:reset_password_email_method_name, :reset_password_mailer)
end
end
The method called above for mailing:
def generic_send_email(method, mailer)
config = sorcery_config
mail = config.send(mailer).send(config.send(method),self)
if defined?(ActionMailer) and config.send(mailer).superclass == ActionMailer::Base
mail.deliver
end
end
Опять все необходимые биты и части почтового программы есть иработа с консоли.