2012-05-01 14 views
5

Quiero módulo recuperable para enviar "invitar" a mensajes de correo electrónico con enlaces para restablecer una contraseña para mis usuarios (la aplicación está en invitar solamente), declaro parcialmente métodos de inicialización:¿Cómo extender adecuadamente el dispositivo recuperable?

module Devise 
    class Mailer 
    def invite_new_user(record) 
     devise_mail(record, :invitation_instructions) 
    end 
    end 
end 

module Devise 
    module Models 
    module Recoverable 
     def send_invite_user_instructions! 
     return unless status == User::STATUS_PENDING 
     generate_reset_password_token! 
     ::Devise.mailer.invite_new_user(self).deliver 
     end 
    end 
    end 
end 

Y recuperable se extendió muy bien, pero dice que mi programa de correo no tiene método invite_new_user (carriles de salida de la consola):

1.9.2p290 :002 > user.send_invite_user_instructions! 
    User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."reset_password_token" = 'zMQK1CEXYupjNKpH8dph' LIMIT 1 
    (0.3ms) BEGIN 
    (15.0ms) UPDATE "users" SET "reset_password_token" = 'zMQK1CEXYupjNKpH8dph', "updated_at" = '2012-05-01 17:40:32.085256' WHERE "users"."id" = 59 
    (4.5ms) COMMIT 
NoMethodError: undefined method `invite_new_user' for Devise::Mailer:Class 

pero tiene vocación método en la misma sesión de consola:

1.9.2p290 :003 > ::Devise.mailer.method_defined? 'invite_new_user' 
=> true 

¿Qué me estoy perdiendo?

+2

Parece 'Devise.mailer' devuelve' Devise :: Mailer', que es una clase, no una instancia. Por lo tanto, probablemente debas definir 'invite_new_user' como' self.invite_new_user'. – Casper

+0

Gracias por la pista, eso me hizo pensar. Parece que este método funciona bien al acceder desde los controladores, pero al cargar solo el modelo en la consola, parece devolver la clase en lugar del objeto como dijiste. – meta

Respuesta

2

Diseñar puede ser puesta a punto para lo que necesita:

1- Crear una clase Mailer en anuncios publicitarios archivo auth_mailer.rb aplicación// y hacer que se heredan de Devise::Mailer

class AuthMailer < Devise::Mailer 
    def invite_new_user(record) 
    devise_mail(record, :invitation_instructions) 
    end 
end 

2- Instruir a Devise para usar su clase editando el archivo config/initializers/devise.rb y agregando

config.mailer = 'AuthMailer' 

3- (opcional) Si(y sólo si) utiliza un correo electrónico de retardo de envío como SideKiq o DelayedJob puede que tenga que carga con ganas en el desarrollo o retraso en el trabajo no puede encontrar su clase AuthMailer. En config/ambientes/development.rb

config.eager_load = true 

4- yo personalmente definir su método send_invite_user_instructions! en mi clase User en lugar de parches Idear clase


Nota al margen: yo no soy una gran fan o haciendo una declaración parcial de una clase en el inicializador de Rails, porque dependiendo de cómo esté diseñada la gema puede tener problemas con la carga automática: hay una gema (Monologue) que recarga objetos durante el tiempo de ejecución, sin ejecutar los inicializadores, por lo que parche de mono funciona bien en la primera llamada, pero no en el próximas llamadas.

Cuestiones relacionadas