Rails 3.2.0.rc1: json and strange respond_with behavior

I have a controller:

class ItemsController < ApplicationController

respond_to :json

def index

  items = Item.all




I am curling my_app/items.json and see a response with JSON object — just as expected. At this point I don’t have any views associated with controller, specifically I don’t have index.html.erb (.html).

Now if only I create an index.haml (for instance), with a simple %h1 Hello, world! line, requesting (again via curl) my_app/items.json returns an html string with

Hello, world!

. Note that I didn’t alter the controller code — it just remains untouched.

I’m sure I’m missing something. Can anyone explain of what’s going on here?


When you rename the index.haml file to index.html.haml, it will work as expected

(at least it works here and I could reproduce your problem).

For json, the default built-in handler for the json format is used.

For html, the index.html.haml template is used


I presume that Rails first checks if for json, a file with any of the standard

handlers is present (from the error message below, that would be :erb,

:builder, :coffee, :haml).

Missing template orders/index, application/index with {:handlers=>[:erb, :builder, :coffee, :haml], :formats=>[:json], :locale=>[:en, :en]}.

Now if it sees a file ending in .html.haml it is clear that this is a html file

(and not an XML or a JSON file) and not use that file as a template.

But for a file index.haml , I presume Rails accepts this also for rendering json,

even without the .json.haml ending …

So, I created 2 additional files:

peterv@e6500:~/b/app/views/orders$ vim index.json.haml

peterv@e6500:~/b/app/views/orders$ rm index.json.haml

peterv@e6500:~/b/app/views/orders$ vim index.haml

peterv@e6500:~/b/app/views/orders$ rm index.haml

And the picking order is clear:

  • highest priority: index.json.haml

  • lesser priority: index.haml

  • default: built-in json renderer

  • never used: index.html.haml



Awesome! Thank you, Peter. Now it’s clear to me of what’s happening.

Also I think the documentation worth mentioning this behavior.