Использование 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 и обработка исключений.
Допустим, у нас есть контроллер:
Далее контроллер, работающий с ajax-запросами. Основная страница выводится полностью, с layout, остальные - только внутренний контент.
Когда мы работаем напрямую, то все работает отлично. Но если, например, в index и create возможны исключения (raise), то тут появляется некоторая проблема - как отображать контент и с каким, собственно, layout или без него. Вроде бы логично было бы в обработчике исключений сделать такую строку:
Но это не верное решение! Для действий, для которых в ContentsController layout определен как false (в нашем случае - все, кроме index), layout просто не будет найден, что приведет к исключению ArgumentError.
Правильная обработка должна выглядеть примерно так:
Именно nil, а не true, тогда RoR корректно определяет layout или его отсутствие. Работает в Ruby on Rails 3.2.9.
Обработка AJAX-запросов в Ruby on Rails.