В Ruby on Rails с паролем сброса пароля от Sorcery есть неопределенная ошибка метода - PullRequest
2 голосов
/ 06 декабря 2011

Использование 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

Опять все необходимые биты и части почтового программы есть иработа с консоли.

Ответы [ 2 ]

3 голосов
/ 27 февраля 2012

Раскомментируйте эти строки в инициализаторе волшебства

user.reset_password_mailer = UserMailer  
user.reset_password_email_method_name = :reset_password_email
0 голосов
/ 03 января 2012

Проверьте ваше приложение / mailers / user_mailer.rb файл.

Если вы следовали руководству, вы, вероятно, сделали что-то вроде копирования и вставки определения метода из вики (которое принимает один параметр) в сгенерированное определение метода (которое не принимает никакого параметра), следовательно, ArgumentError 1 для 0 .

Другими словами, у вас, вероятно, есть что-то похожее на это:

def reset_password_email
   def reset_password_email(user)

Это плохо, но легко исправить: -)

...