Explicit formats in FileSystemResolver

Hello

I have a small research and wanna know what Rails-core team thinking about this problem (if it is problem).

By some reason Rails allow us use view template or layout without explicit extension.

For example we can use app/views/layouts/application.erb instead app/views/layouts/application.html.erb or any other a popular template system like haml or slim without throw any errors. All works as expected but when we try render XHR request, ActionView::Resolver::PathResolver missing format when try extract_handler_and_format_and_variant from path.

https://github.com/rails/rails/blob/master/actionview/lib/action_view/template/resolver.rb#L249

def extract_handler_and_format_and_variant(path, default_formats)
pieces = File.basename(path).split(".")
pieces.shift

  extension = pieces.pop
  unless extension
    ActiveSupport::Deprecation.warn(<<-MSG.squish)
      The file #{path} did not specify a template handler. The default is
      currently ERB, but will change to RAW in the future.
    MSG
  end

  handler = Template.handler_for_extension(extension)
  format, variant = pieces.last.split(EXTENSIONS[:variants], 2) if pieces.last
  format  &&= Template::Types[format]
   
  [handler, format, variant]
end

end

``

format, variant = pieces.last.split(EXTENSIONS[:variants], 2) if pieces.last this expression assign nil to format, so all other works with nil.

So where is a problem here?

If we have action that’s should remote render only async.js.erb template:

class HomeController < ApplicationController
def index
end

def async
end
end

``

This render home/async.js.erb within layouts/application. It is not expected behavior.

Why are my JS views rendering with my HTML layout wrapped around them?

js.erb file not being executed

and many other people with the same problem what i see on SO.

I stepped on a rake these too :slight_smile:

This is very hard to find problem

Only if add layout: false this working properly(or add html extension).

But i found this strange and not useful. I think this is Rails feature and should happen without explicit to declare.

.

def async
layout: false
end

``

Thanks for attention.

P.S. Sorry for my poor English.