Rails 3 remote form: How do I specify the content type?

24,478

Solution 1

You can set the content-type with:

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

As described in rails.js line 106.

Solution 2

For Rails 5, the proper way is to set a data attribute data: { type: :json }.

JQuery UJS docs

Share:
24,478
Chris
Author by

Chris

Updated on August 01, 2020

Comments

  • Chris
    Chris almost 4 years

    I am using Rails 3.2, I have a form and I want it to be posted via ajax and have the controller return json.

    I am using a form_for helper like so:

    = form_for(@object, :remote => true, :format => :json) do |f|
    ....
    

    My objects controller create method looks like this:

      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
    

    The form is submitting ajaxly as expected. But the controller is returning html, not json!

    Inspecting the request with firebug and sure enough the Content-Type http header on the ajax request is being set to application/html.

    The documentation around this is pretty sparse, :format => :json seems to just append ".json" to the forms action, not actually modify any http headers.

    I've also tried :content_type => :json to no effect.

    I can't simply hard code the controller to return json as there are other places where I do want it to return html...

    So does anyone know how to tell the controller to render json when using form_for?

    Thanks for any help

  • Chris
    Chris about 12 years
    Thank you! Knew I was missing something obvious! :)
  • James McMahon
    James McMahon over 10 years
    In Rails 4 you can use format: :json (or :format => :json) instead of :html => {:'data-type' => 'json'}
  • RocketR
    RocketR over 10 years
    @JamesMcMahon In Rails 3.2 either.
  • Taimoor Changaiz
    Taimoor Changaiz about 10 years
    not working in my case :( rails 4 form_for remote true not working and I'm getting this error in browser console Resource interpreted as Script but transferred with MIME type text/html actually response is sent in html form instead of js
  • plainjimbo
    plainjimbo almost 10 years
    That sets the dataType attribute on the ajax request, not the contentType. This results in the changing the Accepts header to json for the request. However, the Content-Type will remain unchanged.
  • EasyCo
    EasyCo about 6 years
    That's a bit heavy @DavyM. He was just trying to help and actually helped me with his link to the UJS docs.