邮件未正确生成

时间:2014-05-04 22:11:48

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 actionmailer

我正在尝试使用rails action mailer生成邮件,但似乎并没有完全正确地完成所有操作:

这是我创建邮件的地方:

class UserNotifier < ActionMailer::Base
    default from: 'mail@mail.com'

    def forgot_password(user)
        setup_email(user)
        @subject += "Password restoration"
        @url = url_for :controller => 'user_session', :action => 'reset_password',
                                        :id => user.pw_reset_code, :only_path => true
    end

    protected
    def setup_email(user)
        @subject = "[MY APP] "
        @sent_on = Time.now
        @user = user
        @content_type = "text/html"
        mail to: user.email
    end
end

这是包含邮件的html.erb

<%= @user.name %>,
<br/><br/>
Restore password:
<%= @url %>

然而,邮件的主题并不是我说的应该是。

但最重要的是,@urlnilhtml.erb,但在forgot_password中生成正确,我对其进行了测试。

为什么nil?我该怎么做才能呈现URL?

2 个答案:

答案 0 :(得分:0)

该行

mail to: user.email

实际上是导致您的电子邮件发送。

因为你在setup_email中调用了这个,所以你实际上是在发送电子邮件,然后在发送后尝试更改主题和URL。

如果您忽略了一秒钟的设置方法,那么您的代码将按照您当前的顺序显示:

    @subject = "[MY APP] "
    @sent_on = Time.now
    @user = user
    @content_type = "text/html"
    mail to: user.email  << MAIL IS SENT HERE
    @subject += "Password restoration"
    @url = url_for :controller => 'user_session', :action => 'reset_password',
                                    :id => user.pw_reset_code, :only_path => true

更新您的代码以最后调用mail命令,例如:

def forgot_password(user)
    setup_email(user)
    @subject += "Password restoration"
    @url = url_for :controller => 'user_session', :action => 'reset_password',
                                    :id => user.pw_reset_code, :only_path => true
    mail to: user.email
end

protected
def setup_email(user)
    @subject = "[MY APP] "
    @sent_on = Time.now
    @user = user
    @content_type = "text/html"
end

答案 1 :(得分:0)

ActionMailer :: Base 对象上调用传递方法时会发送邮件。
您的方法 forgot_password 不会返回此对象 行 mail(to:.....)应该是forgot_password例程中的最后一行

运行 rails console 并输入此内容以查看返回的内容

ActionMailer::Base::mail(to: 'example.com', subject: 'hello')

然后在其上调用#发送