Why do I need `render layout: false` in my Rails controller action?

前端 未结 2 1468
星月不相逢
星月不相逢 2021-01-19 17:21

I\'m use the remote: true idiom from the Working with Javascript in Rails guide:

# new.html.slim
= form_for @thing, remote: true do |f|
  f.text         


        
2条回答
  •  余生分开走
    2021-01-19 17:28

    The action controller in rails responds with HTML response by default (unless otherwise instructed).

    layout 'foo' enforces the use of app/views/layouts/foo.html.slim as the template for your view files. so all the views associated with the actions on your thing_controller.rb are rendered inside the layout 'foo' and the final HTML generated with layout 'foo' and view file create.html.slim is sent back to the client by default.

    If you want to enforce returning js template instead of HTML file, you need to explicitly define it in your action like this:

    # thing_controller.rb
    layout 'foo'
    
    def create
      respond_to do |format|
        # use :template if your view file is somewhere else than rails convention
        format.js {
          :template => "somewhere/create.js.erb", 
          :layout => false
        }
      end
    end
    

    where render layout: false enforces rails NOT TO look for any layout file to wrap your view file (i.e the rails engine just processes create.js.erb file without HTML headers defined on your 'foo' layout) for sending it back to client.

提交回复
热议问题