1

私のアプリには、ユーザーが自分のメールアドレスを入力してリクエストを送信する簡単なサインアップがあります。次に、リクエストは 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");
4

1 に答える 1

2

メールのみを送信したい場合は、「Ajax」よりも「Resque」または「DelayedJob」を使用する必要があります。

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

遅延ジョブ(DJ)| Heroku Dev Center https://devcenter.heroku.com/articles/delayed-job

ただし、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'

ありがとう。

于 2012-06-19T02:19:49.057 に答える