RJSなどのAjax処理中に例外が発生した場合に、通常の例外画面を出したい場合

app/controllers/application.rbで以下のようにかくとできます(もしくは、libでうまく上書きするか)。

def rescue_action_locally(exception)
  add_variables_to_assigns
  @template.instance_variable_set("@exception", exception)
  @template.instance_variable_set("@rescues_path", File.dirname(rescues_path("stub")))
  @template.send!(:assign_variables_from_controller)
  
  @template.instance_variable_set("@contents", @template.render_file(template_path_for_local_rescue(exception), false))
  
  response.content_type = Mime::HTML
  
  if request.xhr?
    render(:update) do |page|
      controller = @template.controller
      page.remove :head
      page.replace_html :body, controller.send(:render_for_file, controller.send(:rescues_path,"layout"), controller.send(:response_code_for_rescue,exception))
    end
  else      
    render_for_file(rescues_path("layout"), response_code_for_rescue(exception))
  end
end

def rescue_action_in_public(exception)
  request.xhr? ? render(:update) {|page| page.redirect_to('適当なエラー用view')} : render(:template => '適当なエラー用view')
end

注意点

layout/application.html.erbあたりで、

<head id="head">
...
</head>
<body id="body">
...
</body>

のようにidを付加していないといけません。

やっていること

Ajaxリクエスト時には、ただ単にrenderを使ってもAjaxリクエストの戻りをrenderするだけなので、少し手をくわえないといけません。
ローカル稼動時には、headを消してcssを無効化し、bodyの内容をrails内部の例外ページに書き換えます。
本番稼動時には、アプリ毎の決まった例外ページに飛ばします。