【问题标题】:How to properly extend Devise Recoverable?如何正确扩展 Devise Recoverable?
【发布时间】:2012-05-01 17:43:30
【问题描述】:

我希望 Recoverable 模块为我的用户发送带有重置密码链接的“邀请”电子邮件(该应用仅在邀请中),我在初始化程序中部分声明了方法:

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

recoverable 得到了很好的扩展,但它说我的邮件没有invite_new_user 方法(rails 控制台输出):

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

但是在同一个控制台会话中调用有方法:

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

我错过了什么?

【问题讨论】:

  • 似乎Devise.mailer 返回Devise::Mailer,这是一个类,而不是一个实例。因此,您可能应该将invite_new_user 定义为self.invite_new_user
  • 感谢提示,这让我思考。从控制器访问时,此方法似乎工作正常,但在控制台中仅加载模型时 - 它似乎返回类而不是像你说的对象。

标签: ruby-on-rails ruby devise


【解决方案1】:

可以根据您的需要设置设计:

1- 在 app/mailers/auth_mailer.rb 文件中创建一个Mailer 类并使其继承自Devise::Mailer

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

2- 通过编辑 config/initializers/devise.rb 文件并添加来指示 Devise 使用您的类

config.mailer = 'AuthMailer'

3-(可选)如果(且仅当)您使用延迟电子邮件发送,例如 SideKiq 或 DelayedJob,您可能需要在开发中预先加载,或者延迟的工作可能找不到您的AuthMailer 课程。在 config/environments/development.rb

config.eager_load = true

4-我个人会在我的 User 类中定义您的 send_invite_user_instructions! 方法,而不是修补 Devise 类


旁注:我不是一个狂热的粉丝,也不是在 Rails 初始化程序中做一个类的部分声明,因为根据 gem 的设计方式,你可能会遇到 autoload 的问题:有一个 gem (Monologue) 可以重新加载对象在运行时,不运行初始化程序,因此猴子补丁在第一次调用时效果很好,但在下一次调用时效果不佳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多