Rails 3 remote form: How do I specify the content type?
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 }
.
Chris
Updated on August 01, 2020Comments
-
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 about 12 yearsThank you! Knew I was missing something obvious! :)
-
James McMahon over 10 yearsIn Rails 4 you can use
format: :json
(or:format => :json
) instead of:html => {:'data-type' => 'json'}
-
RocketR over 10 years@JamesMcMahon In Rails 3.2 either.
-
Taimoor Changaiz about 10 yearsnot 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 almost 10 yearsThat 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 about 6 yearsThat's a bit heavy @DavyM. He was just trying to help and actually helped me with his link to the UJS docs.