【问题标题】:How to render view first and send email in background with Ruby on Rails and ActionMailer如何使用 Ruby on Rails 和 ActionMailer 先渲染视图并在后台发送电子邮件
【发布时间】:2019-08-24 19:09:55
【问题描述】:

我的应用程序有一个简单的注册,用户在其中输入他/她的电子邮件地址并发布请求。然后使用 AJAX 将请求发送到我的服务器,使用 ActionMailer 将电子邮件发送到用户的电子邮件,并使用 jQuery 呈现感谢消息。使用我目前拥有的代码,仅在发送电子邮件后才会呈现感谢消息,因此显示感谢消息需要一些时间。但是,我希望首先呈现感谢消息,然后在后台将电子邮件发送给用户,以便用户可以立即知道他/她的电子邮件已保存。有没有办法使用 Rails 在后台处理电子邮件?

以下是我当前的代码。 在 users_controller.rb 中

def create
  @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      format.html { redirect_to @user, notice: 'Thank you for signing up!' }
      format.js
      format.json { render json: @user, status: :created, location: @user }
      Notifier.email_saved(@user).deliver
    else
      format.html { render action: "new" }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end

在 mailers/notifier.rb 中

class Notifier < ActionMailer::Base
  default from: "First Last <my@email.com>"

  def email_saved(user)
    @email = user.email
    mail to: @email, subject: 'Auto-Response: Thank you for signing up'
  end
end

在 users/create.js.erb 中

$("<div class='alert alert-success'>Thank you for showing your interest! A confirmation email will be sent to you shortly.</div>").insertAfter("#notice");

【问题讨论】:

  • 查看delayed_job github.com/collectiveidea/delayed_job 您可以使用它来让您的应用程序的许多部分在后台运行。
  • 感谢伟大的链接。我让 DJ 运行,它运行良好。

标签: ruby-on-rails ajax actionmailer


【解决方案1】:

如果你只想发送邮件,你应该使用比“Ajax”更好的“Resque”或“Delayed Job”。

#271 Resque - RailsCasts http://railscasts.com/episodes/271-resque

Delayed Job (DJ) | Heroku Dev Center https://devcenter.heroku.com/articles/delayed-job

但是如果你想使用Ajax发送邮件,请参考下面的sn-ps。

#app/controllers/users_controller.rb
def create
  @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      format.html { redirect_to @user, notice: 'Thank you for signing up!', sign_up_flag: 1 }
      format.js
      format.json { render json: @user, status: :created, location: @user }
    else
      format.html { render action: "new" }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end

def send_mail(user_id)
    begin
      user = User.find(user_id)
      Notifier.sign_up_mail(user.email).deliver
      render :nothing => true, :status => 200
    rescue
      render :nothing => true, :status => 500
    end
end



#app/mailers/notifier.rb
class Notifier < ActionMailer::Base
  default from: "First Last <my@email.com>"

  def sign_up_mail(email)
    mail to: email, subject: 'Auto-Response: Thank you for signing up'
  end
end



#app/views/???.html.erb
<% if @sign_up_flag == 1 %>
  $(document).ready(function(){
    $.ajax({
      type: "POST",
      url:  "/sendmail",
      data: "",
      success : function(){},
      error : function() {}
    });
  });
<% end %>



#config/routes.rb
  post '/sendmail' => 'users#send_mail'

谢谢。

【讨论】:

  • 我试过delayed_jobs,它工作得很好。感谢您的帮助!
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2015-07-23
  • 2013-06-08
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多