Search code examples
javascripthtmlruby-on-railshamlujs

Difference between application.haml and application.html.haml?


Since many days I tried to understand why a simple link like this one :

link_to 'My Link', my_path(format: :js), remote: true

was always returning full HTML document instead of executing javascript located in my file.js.erb :

alert('hello world')

[...]

After hours of debugging I found why:

When I rename my main layout file such as: application.haml it renders full HTML document :

Started GET "/my_path/2.js" for 127.0.0.1 at 2016-03-05 12:28:20 +0100
Processing by MyController#show as JS
  Rendered my_path/show.js.erb within layouts/application (0.1ms)
  Rendered layouts/_sidebar.html.erb (18.9ms)
  Rendered layouts/_headbar.haml (0.5ms)
  Rendered layouts/_flash_messages.html.haml (0.2ms)
  Rendered layouts/_footer.html.erb (0.1ms)
Completed 200 OK in 102ms (Views: 59.3ms | ActiveRecord: 2.9ms)

When I rename my main layout file such as: application.html.haml it executes javascript properly and runs my hello world popup :

Started GET "/my_path/8.js" for 127.0.0.1 at 2016-03-05 12:28:34 +0100
Processing by MyController#show as JS
  Rendered my_path/show.js.erb (0.1ms)
Completed 200 OK in 24ms (Views: 21.8ms | ActiveRecord: 0.4ms)

Why is there a difference in the javascript behavior according the different filenames of my layout ?


Solution

  • As BroiSatse said:

    This is not javascript behaviour, it is how rails searches for templates. First it search for <action_name>.<templating-engine> files, then for <action_name>.<format><templateing-engine>. So when you have generic template without the format, it will be taken for all the formats.