AJAX用于呈现部分或显示表单错误

时间:2013-04-19 19:08:51

标签: ruby-on-rails ajax forms devise partial

我在使用Rails以AJAX方式解决表单处理方面遇到了困难。我将尝试解释我所拥有的不同部分,以及我怀疑的地方:

以下是 new.html.erb 的外观:

<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name), :remote => true) do |f| %>
  <%= f.input :email, :label => false, :placeholder => 'Enter Email' %>
  <%= f.submit "Step inside", :id => 'invitation_button' %>
<% end %>

<div id="request_invite">
</div>

如您所见,我有:remote => true,因此提交是通过AJAX完成的。另外,我有一个空容器(#request_invite),如果提交成功,将填充部分容器。

以下是 registrations_controller.rb(创建方法)的样子:

def create
    build_resource

    if resource.save
      if resource.active_for_authentication?
        sign_in(resource_name, resource)
        respond_with resource, :location => after_sign_up_path_for(resource)
      else
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      respond_with resource
    end
  end

我怀疑在这里。我应该写什么才能让JS知道提交成功与否。如果成功,我想将一个名为_thank_you.html.erb的部分呈现到#request_invite容器中。如果不成功,我想在表单中显示错误。

这是我的Javascript文件来处理AJAX响应:

$('document').ready(function() {
  $("#new_user").on('ajax:success', function(data, status, xhr)
  {
    alert("test");
  })
});

现在警报(“测试”)总是出现,因为我无法知道是否成功。

非常感谢,我希望我能够很好地解释自己。

1 个答案:

答案 0 :(得分:1)

如果您进行了手动ajax调用,并且在提交表单时成功和失败回调(而不是使用remote:true),该怎么办?我很累,并且不确定我是否正在按照你的控制器动作进行操作。

  $('#form_name').submit (e) ->
    e.preventDefault()
    $.ajax
      type: "POST"
      url: "/whatever_the_path_is"
      data: { 'email': $(@).val() }
      success: (result) ->
        $('#request_invite').html(result)
      failure: ->
        $('#request_invite').html("<h1>Request Failed</h1>")

您的控制器可能如下所示:

def create
      build_resource

      if resource.save
        if resource.active_for_authentication?
          sign_in(resource_name, resource)
          # respond_with resource, :location => after_sign_up_path_for(resource)
          render partial: '/partials_folder/thank_you'
        else
          expire_session_data_after_sign_in!
          # respond_with resource, :location => after_inactive_sign_up_path_for(resource)
          render partial: '/partials_folder/there_was_an_error'
        end
      else
        clean_up_passwords resource
        respond_with resource
      end
    end

希望这能让你开始走上正确的道路。