Никогда не отображать макет в ответ на xhrs - PullRequest
12 голосов
/ 15 марта 2010

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

Как я могу сделать это по умолчанию ? Я хотел бы написать

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

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

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

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

Ответы [ 3 ]

11 голосов
/ 16 марта 2010

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

class UsersController < ApplicationController
  layout proc {|controller| controller.request.xhr? ? false : "application" }
end
5 голосов
/ 18 сентября 2014

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

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

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

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

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

1 голос
/ 15 марта 2010

Обычный 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...