Подтвердить что ты не робот

Никогда не создавайте макет в ответ на xhrs

В большинстве случаев я не хочу отображать макет, когда запрос поступает из AJAX. С этой целью я часто пишу render :layout => !request.xhr? в своих действиях контроллера.

Как я могу сделать это по умолчанию? I.e., я хотел бы иметь возможность писать

def new
  Post.find(params[:id])
end

и имеют функциональность

def show
  Post.find(params[:id])
  render :layout => !request.xhr?
end

(Я прекрасно вручную указываю макет в редких случаях, в которых я хочу его использовать.)

4b9b3361

Ответ 1

Как насчет этого?

class UsersController < ApplicationController
  layout proc {|controller| controller.request.xhr? ? false: "application" }
end

Ответ 2

Чтобы сделать его по умолчанию никогда не отображать макет для любого запроса XHR, вы можете сделать это:

class ApplicationController < ActionController::Base
  layout proc { false if request.xhr? }
end

Когда запрос является запросом XHR, он отображает запрашиваемое представление без макета. В противном случае он использует поведение макета по умолчанию, которое ищет макет по наследованию.

Это отличается от выражения controller.request.xhr? ? false : 'application', поскольку это всегда отображает макет application для запроса, отличного от XHR, что фактически отключает поиск по наследованию.

Также см. документацию ActionView для аргумента nil и наложения макета.

Ответ 3

Нормальный after_filter не будет работать, потому что мы хотим изменить рендеринг.

Как насчет захвата рендера?

class ApplicationController < ActionController::Base

  private
  def render(options = nil, extra_options = {}, &block) 
    options = {:layout => !request.xhr?}.merge(options) unless options.nil?
    super(options, extra_options)      
  end
end

Установите макет при вызове рендера, чтобы переопределить его. Немного уродливый, но должен работать.