Rails:after_create会导致ajax出现性能问题

时间:2012-05-12 16:48:03

标签: jquery ruby-on-rails ajax devise

我正在使用本教程构建一个prelaunch注册站点。 http://railsapps.github.com/tutorial-rails-prelaunch-signup.html。在用户输入他们的电子邮件以请求邀请之后,它使用ajax呈现_thankyou.html部分,该部分是从被覆盖的Devise注册控制器呈现的。

但是,该网站还使用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;
  });

1 个答案:

答案 0 :(得分:2)

我的猜测是发送电子邮件是花费最多时间,尝试使用delayed_job或其他一些后台处理来实际发送电子邮件,所以after_create只会将要发送的电子邮件排队,但它实际上是由后台程序发送

https://github.com/collectiveidea/delayed_job