Ответ 1
Как насчет этого?
class UsersController < ApplicationController
layout proc {|controller| controller.request.xhr? ? false: "application" }
end
В большинстве случаев я не хочу отображать макет, когда запрос поступает из 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
(Я прекрасно вручную указываю макет в редких случаях, в которых я хочу его использовать.)
Как насчет этого?
class UsersController < ApplicationController
layout proc {|controller| controller.request.xhr? ? false: "application" }
end
Чтобы сделать его по умолчанию никогда не отображать макет для любого запроса XHR, вы можете сделать это:
class ApplicationController < ActionController::Base
layout proc { false if request.xhr? }
end
Когда запрос является запросом XHR, он отображает запрашиваемое представление без макета. В противном случае он использует поведение макета по умолчанию, которое ищет макет по наследованию.
Это отличается от выражения controller.request.xhr? ? false : 'application'
, поскольку это всегда отображает макет application
для запроса, отличного от XHR, что фактически отключает поиск по наследованию.
Также см. документацию ActionView для аргумента nil
и наложения макета.
Нормальный 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
Установите макет при вызове рендера, чтобы переопределить его. Немного уродливый, но должен работать.