2012-05-12 12 views
1

私はこのチュートリアルで事前開始サイトを構築しています。 http://railsapps.github.com/tutorial-rails-prelaunch-signup.html。ユーザーが招待状を要求する電子メールを入力すると、ajaxを使って_thankyou.htmlが部分的にレンダリングされ、オーバーライドされたDevise登録コントローラーからレンダリングされます。Rails:after_createによりajaxでパフォーマンスの問題が発生する

ただし、このサイトでは、after_create :send_welcome_emailコールバックを使用して、「招待状を送信しました」という歓迎メールを送信しています。これにより、ajaxのパフォーマンスが大幅に低下します。 after_createコールバックがなければ、ajax(少なくともローカルホスト上)は非常に高速に動作し、フォームはすばやく消え、感謝の部分はほとんど即座にレンダリングされます。しかし、after_createコールバックを含めるとフォームが消えるまでに長い時間がかかります(ユーザーに送信ボタンを何度もクリックさせて問題が増えます)。

感謝のあなたの部分がレンダリングされた後に電子メールが引き起こされるように物事を整理する方法はありますか?

新しい工夫が法

# ovverride #create to respond to AJAX with a partial 
    def create 
    build_resource 

    if resource.save 
     if resource.active_for_authentication? 
     sign_in(resource_name, resource) 
     (render(:partial => 'thankyou', :layout => false) && return) if request.xhr? 
     respond_with resource, :location => after_sign_up_path_for(resource) 
     else 
     expire_session_data_after_sign_in! 
     (render(:partial => 'thankyou', :layout => false) && return) if request.xhr? 
     respond_with resource, :location => after_inactive_sign_up_path_for(resource) 
     end 
    else 
     clean_up_passwords resource 
     render :action => :new, :layout => !request.xhr? 
    end 
    end 

AJAXを作成するには、招待提出要求でトリガ。 、

// use AJAX to submit the "request invitation" form 
    $('#invitation_button').live('click', function() { 
    var email = $('form #user_email').val(); 
    var password = $('form #user_password').val(); 
    var dataString = 'user[email]='+ email + '&user[password]=' + password; 
    $.ajax({ 
     type: "POST", 
     url: "/users", 
     data: dataString, 
     success: function(data) { 
     $('#request-invite').html(data); 
     } 
    }); 
    return false; 
    }); 

答えて

2

私の推測では、電子メールは、実際には、電子メールの送信を行うことをdelayed_jobまたは他のいくつかのバックグラウンド処理を使用してみてくださいほとんどの時間を要するもので送信しているので、送信するafter_createはちょうど電子メールをキューう実際にはバックグラウンドプロセスによって送信されます。

https://github.com/collectiveidea/delayed_job

関連する問題