如何通过AJAX传递和使用成功/失败响应

保罗·一月

我用AJAX替换了标准的服务器端表单。我让它们工作,但现在我想从我可以在客户端中使用的服务器传递成功/错误消息。我的客户端 AJAX 代码是:

var csrf = $('input.csrf').val();
$.ajax({
        url: '/unauthmessages',
        type: 'post',
        data: { message: { name: name, message: message }  },
        headers: {
                  'X-CSRF-TOKEN': csrf
                 },
        dataType: 'json',
        success: function (data) {
                    console.log(data);
                 }
})

我的控制器动作是:

def create(conn, %{"message" => message_params}) do
    messageChangeset = Message.changeset(%Message{}, message_params)
    case Repo.insert(messageChangeset) do
      {:ok, _message} ->
        conn
        |> put_flash(:info, "Success")
        |> redirect(to: "/us#vpageContactos")
      {:error, messageChangeset} ->
        vpage = "contactos"
        render(conn, FabASA.PageView, "us.html", messageChangeset: messageChangeset, vpage: vpage)
    end
  end

如何更改控制器/成功功能以传递/使用成功/错误消息?

纳文·佩里斯(Navin Peiris)

上面的渲染/重定向不起作用,因为 AJAX 将响应内容视为将与成功/错误状态一起返回的简单数据,而不是需要显示的页面。此外,重定向之后会默默地跟随 AJAX 调用,您最终将看到重定向到的页面内容作为数据而不是浏览器页面重定向。

恕我直言,处理此问题的最佳方法是将您的意图作为 JSON 响应返回,客户端 JS 将根据成功/错误状态知道如何处理。

例如,您可以在控制器中返回类似以下的内容:

def create(conn, %{"message" => message_params}) do
  messageChangeset = Message.changeset(%Message{}, message_params)
  case Repo.insert(messageChangeset) do
    {:ok, _message} ->
      conn
      |> put_flash(:info, "Success")
      |> json(%{redirect_to: "/us#vpageContactos"})
    {:error, messageChangeset} ->
      conn
      |> put_status(:bad_request)
      |> json(errors_in(changeset))
  end
end

# NOTE: The following should probably be in ErrorHelpers
defp errors_in(%{errors: errors}) do
  translated_errors = for {field, message} <- errors, into: %{}, do: {field, MyApp.ErrorHelpers.translate_error(message)}
  %{errors: translated_errors}
end
defp errors_in(_), do: %{}

然后,在客户端调用中,您可以执行以下操作:

var csrf = $('input.csrf').val();
$.ajax({
  url: '/unauthmessages',
  type: 'post',
  data: { message: { name: name, message: message } },
  headers: { 'X-CSRF-TOKEN': csrf },
  dataType: 'json',
  success: function(data) {
    window.location.href = data.redirect_to;
  },
  error: function(xhr) {
    var errors = xhr.responseJSON();
    // Show the errors to the client
  }
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Spring中通过HTTP响应传递和处理异常?

通过Ajax成功函数传递参数

使用jQuery中的延迟对象为多个ajax调用处理不同的成功和失败状态

如何从Django发送失败响应到Ajax

Firebase Cloud Messaging-响应JSON中的“成功”和“失败”

AJAX成功失败回调不起作用

如何从Flux中检测并响应组件的成功和失败?

如何使用带有成功和失败处理程序的引用重试Ajax调用

将参数从ajax成功响应传递到Url Action方法

如何使用jQuery Ajax和PHP响应重定向

如何使用laravel响应以ajax成功下载文件

如果验证失败,如何使用ajax和php以模态形式显示错误,如果成功,如何重定向到其他页面

如何将值传递给ajax响应并接收成功函数

如何获得成功的ajax响应并使用jQuery将其分配给变量?

如何通过ajax传递数组?

如何在SDwebimage中使用成功和失败块

如何遍历ValidationNEL的成功和失败结果?

Rails的AJAX响应成功/失败

如何在php脚本中使用通过ajax传递的数据?

如何通过jquery ajax和MVC模型传递formData(fileupload)

在本地计算机成功失败时应进行模拟

通过Windows bat文件记录成功和失败状态

需要通过 Ajax 传递参数(使用延迟和承诺)帮助

AJAX 响应成功

显示隐藏成功失败警报

使用预设值初始化第一个 ajax 数据,然后从成功响应中传递它

如何处理 Retrofit 和 RxJava2 中的成功和失败响应?

如何使用powershell从html获取通过和失败计数

使用 Spring WebClient,我如何反序列化不同类型的成功和失败响应?