Devise中的自定义变量重置密码说明?

时间:2012-07-18 13:06:56

标签: ruby-on-rails devise mailer password-recovery

我需要能够自定义rails devise mailer视图以重置密码说明。

为此,我需要做两件事。

  1. 指定链接的自定义URL,以使其成为基于特定业务逻辑的主机/域。当用户单击忘记密码时,此主机和域来自浏览器中的URL,即请求对象。所以我没有在delayed_job中使用request对象来处理它,因此我需要能够在发送电子邮件的delayed_job中的某个时刻执行此操作。

  2. 将自定义变量传递给邮件程序视图,以便我可以为视图添加各种其他逻辑,隐藏和显示我需要的位。

  3. 有人可以帮忙吗?我可以看到你可以为设计生成邮件程序视图,但我还需要能够将各种项目传递给它。例如,我是否需要在用户模型和密码控制器中以某种方式覆盖这些功能?

4 个答案:

答案 0 :(得分:2)

覆盖整个控制器方法并在send_reset_password_instructions opts参数中添加param即可解决此问题。

@resource.send_reset_password_instructions(
    email: @email,
    provider: 'email',
    redirect_url: @redirect_url,
    client_config: params[:config_name],
    parameter_passed: params[:parameter_passed],
  )

您可以使用message['parameter_passed']

的形式访问视图中的参数

答案 1 :(得分:1)

所以,经过多次努力,搜索和黑客攻击......这是不可能的。所以我最终编写了自己的邮件程序并绕过控制器中的设计重置密码方法,生成我自己的重置令牌,设置我需要的变量,称为我的用户邮件....并在我的邮件中嵌入设计URL以获取它单击密码重置链接后再调用设备,然后一切都很好....

我讨厌重写逻辑,但最终却是最快捷,最干净的解决方案。

一种近乎有效的方法是在我的用户模型上使用非activerecord属性来存储我需要的位并在设计视图中将其“黑客”到@resource中,但是这样做会导致一些悲伤,结果,我选择了以上选项......

答案 2 :(得分:1)

我需要添加一个source以包含在重置密码视图中,这是我实现的内容:

class User < ActiveRecord::Base
  prepend ResetPasswordWithSource

  devise :recoverable

  ....
end

module User::ResetPasswordWithSource
  def send_reset_password_instructions(source=nil)
    @source = source
    super()
  end

  def send_devise_notification(notification, *args)
    args.last.merge!({ source: @source })
    super
  end
end

您可以在此处致电user.send_reset_password_instructions('special_source')

可以通过@options[:source] = 'special_source'

访问视图

答案 3 :(得分:0)

在我意识到在调用super之前声明自定义变量将起作用之前,我也在努力解决这个问题。

  def reset_password_instructions(record, token, opts={})
   @custom_variable = "Greetings, world"

    # your gorgeous code

   mailer_object = super

   mailer_object
  end