【问题标题】:How to respond to AJAX form submission in Rails?在 Rails 中如何响应 AJAX 表单提交?
【发布时间】:2024-08-01 01:00:01
【问题描述】:

这是我用 HTML 制作的一个简单的告诉朋友表单,它正确地将数据发送回我的服务器并正确提交。

这是 javascript 代码(在 CoffeeScript 中):

$('#tell-a-friend-form').submit (e) ->
    e.preventDefault()
    console.log "submitted form."

    $.ajax
      url: 'home/tellafriend'
      type: 'POST'  
      data:
        name: $(this).find("input[name='name']").val()
        emails: $(this).find("input[name='emails']").val()
        message: $(this).find("textarea[name='message']").val()
      success: (result) ->
        alert("ok")
        $('#tell-a-friend-form').find(".loading-icon").hide()
      error: (result) ->
        alert("Sorry, we couldn't send your message.")    
        $('#tell-a-friend-form').find(".loading-icon").hide()
        $('.tell-a-friend-submit').removeAttr("disabled")

    $(this).find(".tell-a-friend-submit").attr("disabled", "disabled")
    $(this).find(".loading-icon").show()

现在,在控制器中,我根本不需要返回任何消息,除了可能是“已发送成功”类型的布尔值,因此客户端 javascript 可以知道是“成功”还是“错误”。

目前,客户端每次都会触发“错误”。

这是我的控制器代码:

def tellafriend
  #send the actual email message. to be implemented.

  respond_to do |format|
    format.json { render :json => "success" }
  end
end

我在控制器端做错了什么?我确定问题出在这里。如果我想触发“成功”位,我需要返回什么?

【问题讨论】:

  • 你什么都不能返回...无论如何,ajax 请求是否命中了控制器代码?我认为问题不存在。
  • 我认为 Ruby 总是返回最后一行。这对我没有帮助。编辑:Yes 控制器代码与适当的数据一起被命中。问题在于Controller返回。
  • 哦,我根本不知道Ruby...
  • 当我想在 Rails 中不带任何负载的情况下成功返回时,我喜欢使用head :ok,它只会将带有 HTTP 成功代码的标头返回给客户端,但不会发送任何内容身体。但是,我不能说为什么你的方法失败了。

标签: jquery ajax json forms coffeescript


【解决方案1】:

当您提出请求时,您的日志会显示什么?这对于诊断这类事情很重要。我能想到的三件事通常可以解决这个问题:

显式请求 JSON

这可能就像从您的 AJAX 调用中显式请求 JSON 一样简单:

$.ajax
  url: 'home/tellafriend'
  type: 'POST'
  dataType: 'json'
  ...

检查您的路线:

您的路由可能未配置为响应 POST 请求。确保您的“tellafriend”路线接受帖子。作为快速检查,您可以将 AJAX 请求更改为“GET”或访问 /home/tellafriend.json

返回一个有效对象

您可能想尝试返回一个实际对象,而不是简单地返回“成功”:

respond_to do |format|
  format.json { render :json => {:message => "success"} }
end

【讨论】:

  • 第三点是魅力。我必须返回一个有效的对象。
  • 泰!其他问题的答案并没有解决我的问题。我正在做类似:json => "success" 的事情,但我猜这不会创建有效的 json 对象