Cайт веб-разработчика, программиста Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Первоуральск

Админка на Ruby on Rails

Использование layout в контроллере, обрабатывающим ajax-запросы и исключения

Столкнулся вчера с проблемой. Возможно просто по незнанию, не большому опыту, но все-таки хочу поделиться, но и прежде всего для себя заметку сделать. Работа с ajax и обработка исключений.

Допустим, у нас есть контроллер:

class ApplicationController < ActionController::Base

  layout 'application'

  ...

end

Далее контроллер, работающий с ajax-запросами. Основная страница выводится полностью, с layout, остальные - только внутренний контент.

class ContentsController < ApplicationController

  layout false, :except => :index

  rescue_from Content::Exception, :with => :exception_handler


  def index
    ...
  end

  def create
    ...
  end

end

Когда мы работаем напрямую, то все работает отлично. Но если, например, в index и create возможны исключения (raise), то тут появляется некоторая проблема - как отображать контент и с каким, собственно, layout или без него. Вроде бы логично было бы в обработчике исключений сделать такую строку:

render :layout => ! request.xhr?

Но это не верное решение! Для действий, для которых в ContentsController layout определен как false (в нашем случае - все, кроме index), layout просто не будет найден, что приведет к исключению ArgumentError.

Правильная обработка должна выглядеть примерно так:

render :layout => ( request.xhr? ? false : nil )

Именно nil, а не true, тогда RoR корректно определяет layout или его отсутствие. Работает в Ruby on Rails 3.2.9.

Обработка AJAX-запросов в Ruby on Rails.