Rails 3远程表单:如何指定内容类型?

Chr*_*ris 36 forms ajax ruby-on-rails ujs ruby-on-rails-3

我正在使用Rails 3.2,我有一个表单,我希望它通过ajax发布并让控制器返回json.

我正在使用form_for帮助器,如下所示:

= form_for(@object, :remote => true, :format => :json) do |f|
....
Run Code Online (Sandbox Code Playgroud)

我的对象控制器create方法如下所示:

  def create
    respond_to do |format|
      if @object.save
         format.html { redirect_to @object }
         format.json { render json: @object, status: :created, location: @object }
      else
        format.html { render action: "new" }
        format.json { render json: @object.errors, status: :unprocessable_entity }
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

表格按预期提交ajaxly.但是控制器正在返回html,而不是json!

使用firebug检查请求,并确定ajax请求中的Content-Type http标头设置为application/html.

围绕这个的文档非常稀疏,:format =>:json似乎只是将".json"附加到表单操作,而不是实际修改任何http标头.

我也尝试过:content_type =>:json没效果.

我不能简单地硬编码控制器来返回json,因为还有其他地方我希望它返回html ...

所以有人知道如何告诉控制器在使用form_for时渲染json吗?

谢谢你的帮助

spa*_*pas 51

您可以使用以下内容设置内容类型:

= form_for(@object, :remote => true, :html => {:'data-type' => 'json'})

rails.js第106行中所述.

  • 在Rails 4中,您可以使用`format :: json`(或`:format =>:json`)而不是`:html => {:'data-type'=>'json'}` (18认同)
  • 这将在ajax请求上设置dataType属性,而不是contentType。这导致将请求的Accepts标头更改为json。但是,内容类型将保持不变。 (2认同)

小智 7

对于 Rails 5,正确的方法是设置数据属性 data: { type: :json }

JQuery UJS 文档

  • 这有点沉重@DavyM。他只是想帮助我,实际上帮助我链接到 UJS 文档。 (3认同)