2012-10-11 36 views
6

que estoy tratando de reemplazar el método '' send_confirmation_instructions como se muestra aquí:que concebir y cómo reemplazar send_confirmation_instructions

http://trackingrails.com/posts/devise-send-confirmation-mail-manually-or-delay-them

con:

def send_confirmation_instructions 
    generate_confirmation_token! if self.confirmation_token.nil? 
    ::Devise.mailer.delay.confirmation_instructions(self) 
end 

Esto parece funcionar ya no está con la última versión de idear. Los documentos de diseño muestran cómo anular un controlador pero no un modelo. ¿Alguna sugerencia sobre cómo anular un modelo de diseño? Gracias

Respuesta

7

Al configurar Diseñar, te dice que cuál es el modelo que está trabajando en (usuario, por ejemplo); muchos/la mayoría de sus métodos se aplican a esa clase. Entonces ahí es donde querrás anular cosas.

Aquí hay un comentario del código Devise en lib/devise/models/authenticatable.rb que describe casi exactamente lo que quiere hacer, si estoy leyendo correctamente.

# This is an internal method called every time Devise needs 
    # to send a notification/mail. This can be overriden if you 
    # need to customize the e-mail delivery logic. For instance, 
    # if you are using a queue to deliver e-mails (delayed job, 
    # sidekiq, resque, etc), you must add the delivery to the queue 
    # just after the transaction was committed. To achieve this, 
    # you can override send_devise_notification to store the 
    # deliveries until the after_commit callback is triggered: 
    # 
    #  class User 
    #  devise :database_authenticatable, :confirmable 
    # 
    #  after_commit :send_pending_notifications 
    # 
    #  protected 
    # 
    #  def send_devise_notification(notification) 
    #   pending_notifications << notification 
    #  end 
    # 
    #  def send_pending_notifications 
    #   pending_notifications.each do |n| 
    #   devise_mailer.send(n, self).deliver 
    #   end 
    #  end 
    # 
    #  def pending_notifications 
    #   @pending_notifications ||= [] 
    #  end 
    #  end 
    # 
    def send_devise_notification(notification) 
    devise_mailer.send(notification, self).deliver 
    end 
+0

Gracias, ¿está diciendo agregar "send_devise_notification" a mi archivo user.rb? Intenté eso y no se llamó ... – AnApprentice

+0

Sí, anule 'send_devise_notification' en su modelo de Usuario. Pude interceptar la notificación (acabo de enviar algo al registro para demostrar que funciona) con una versión actual de Devise. Pero para que todo funcione, lea el comentario: no solo se trata de definir el método, sino que también debe agregar el filtro 'after_commit' para crear la cola del trabajo retrasado (o lo que sea). –

+0

Gracias, pero esto no es donde vive "send_confirmation_instructions"? y necesito modificar ese método "send_confirmation_instructions" – AnApprentice

0

Por qué no usar devise-async?

Usage 

Devise >= 2.1.1 

Include Devise::Async::Model to your Devise model 

class User < ActiveRecord::Base 
    devise :database_authenticatable, :confirmable # etc ... 

    include Devise::Async::Model # should be below call to `devise` 
end 

Devise < 2.1.1 

Set Devise::Async::Proxy as Devise's mailer in config/initializers/devise.rb: 

# Configure the class responsible to send e-mails. 
config.mailer = "Devise::Async::Proxy" 

All 

Set your queuing backend by creating config/initializers/devise_async.rb: 

# Supported options: :resque, :sidekiq, :delayed_job 
Devise::Async.backend = :resque 
+0

Debido legado-asíncrono no almacena los atributos virtuales que pondrán al usuario (attr_accessor). – AnApprentice

+0

Si desea utilizar la última versión de legado esto ya no es una opción, como se puede ver en [sus documentos] (https://github.com/mhfs/devise-async#devise--40) no apoyan Diseñar> = 4.0 –