Ruby on rails 如何使用RubyonRails和ActionMailer首先呈现视图并在后台发送电子邮件
我的应用程序有一个简单的注册,用户在其中键入他/她的电子邮件地址并发布请求。然后使用AJAX将请求发送到我的服务器,使用ActionMailer将电子邮件发送到用户的电子邮件,并使用jQuery呈现感谢消息。根据我目前掌握的代码,只有在发送电子邮件后才会显示感谢信息,因此显示感谢信息需要一些时间。但是,我希望首先呈现感谢信息,然后在后台将电子邮件发送给用户,以便用户可以立即知道他/她的电子邮件已保存。有没有办法在后台用Rails处理电子邮件 下面是我当前的代码。 在用户_controller.rb中Ruby on rails 如何使用RubyonRails和ActionMailer首先呈现视图并在后台发送电子邮件,ruby-on-rails,ajax,actionmailer,Ruby On Rails,Ajax,Actionmailer,我的应用程序有一个简单的注册,用户在其中键入他/她的电子邮件地址并发布请求。然后使用AJAX将请求发送到我的服务器,使用ActionMailer将电子邮件发送到用户的电子邮件,并使用jQuery呈现感谢消息。根据我目前掌握的代码,只有在发送电子邮件后才会显示感谢信息,因此显示感谢信息需要一些时间。但是,我希望首先呈现感谢信息,然后在后台将电子邮件发送给用户,以便用户可以立即知道他/她的电子邮件已保存。有没有办法在后台用Rails处理电子邮件 下面是我当前的代码。 在用户_controller.r
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
类通知程序$("<div class='alert alert-success'>Thank you for showing your interest! A confirmation email will be sent to you shortly.</div>").insertAfter("#notice");
$(“感谢您的关注!我们将很快向您发送一封确认电子邮件。”)。之后插入(“通知”);
如果您只想发送邮件,您应该使用比“Ajax”更好的“重新创建”或“延迟作业”
但如果您想使用Ajax发送邮件,请使用下面的代码片段作为参考
#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'
#app/controllers/users_controller.rb
def创建
@user=user.new(参数[:user])
回应待办事项|格式|
如果@user.save
format.html{redirect_to@user,注意:'谢谢你注册!',注册标志:1}
format.js
format.json{render json:@user,status::created,location:@user}
其他的
format.html{呈现操作:“新建”}
format.json{render json:@user.errors,status::unprocessable_entity}
结束
结束
结束
def发送邮件(用户id)
开始
user=user.find(用户id)
通知者。注册邮件(user.email)。发送
呈现:nothing=>true,:status=>200
营救
呈现:nothing=>true,:status=>500
结束
结束
#app/mailers/notifier.rb
类通知程序“用户#发送邮件”
谢谢。查看
延迟作业
您可以使用它使应用程序的许多部分在后台运行。感谢您提供的精彩链接。我让DJ运行起来,效果很好。我试过延迟工作,效果很好。谢谢你的帮助!