ruby-on-rails - Rails 3 中的动态错误页面

标签 ruby-on-rails ruby-on-rails-3 exception error-handling actionview

在 Rails 2.3.x 中,您可以像这样覆盖 render_Optional_error_file:

# ApplicationController.rb
protected
  def render_optional_error_file(status_code)
    render :template => "errors/500", :status => 500, :layout => 'application'
  end

但是,Rails 3 不再具有 render_Optional_error_file。相反,您需要覆盖 rescue_action_in_public,您可以这样做:

# config/initializers/error_page.rb
module ActionDispatch
  class ShowExceptions

    protected    
      def rescue_action_in_public(exception)
        status = status_code(exception).to_s

        template = ActionView::Base.new(["#{Rails.root}/app/views"])
        if ["404"].include?(status)
          file = "/errors/404.html.erb"
        else
          file = "/errors/500.html.erb"
        end        
        body = template.render(:file => file)

        render(status, body)
      end

  end
end

这可以工作,但不使用应用程序的布局。但是,如果您像这样指定布局路径:

body = template.render(:file => file, :layout => "layouts/application") # line 15

您在故障安全响应期间收到错误:ActionView::Template::Error

application.html.erb:4 的第 4 行是:

<%= stylesheet_link_tag "app", "jquery-ui", "jquery.fancybox", :cache => "all" %>

ActionView 通常用来渲染模板的任何内容都不会被加载。

堆栈跟踪是:

  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:794:in `join'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:794:in `rails_asset_id'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:817:in `rewrite_asset_path'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:746:in `compute_public_path'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:424:in `path_to_stylesheet'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:875:in `ensure_stylesheet_sources!'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:874:in `each'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:874:in `ensure_stylesheet_sources!'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/helpers/asset_tag_helper.rb:512:in `stylesheet_link_tag'
  /data/sites/fundraisers-stage/releases/20110316194843/app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb___19482063_70294907435920_0'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/template.rb:135:in `send'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/template.rb:135:in `render'
  /var/lib/gems/1.8/gems/activesupport-3.0.5/lib/active_support/notifications.rb:54:in `instrument'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/template.rb:127:in `render'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/render/layouts.rb:80:in `_render_layout'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/render/rendering.rb:62:in `_render_template'
  /var/lib/gems/1.8/gems/activesupport-3.0.5/lib/active_support/notifications.rb:52:in `instrument'
  /var/lib/gems/1.8/gems/activesupport-3.0.5/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
  /var/lib/gems/1.8/gems/activesupport-3.0.5/lib/active_support/notifications.rb:52:in `instrument'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/render/rendering.rb:56:in `_render_template'
  /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_view/render/rendering.rb:26:in `render'
  /data/sites/fundraisers-stage/releases/20110316194843/config/initializers/error_pages.rb:15:in `rescue_action_in_public'

最佳答案

在 Rails 3.2 中,比这更容易:

将此添加到config/application.rb:

config.exceptions_app = self.routes

这会导致错误通过路由器进行路由。然后你只需添加到config/routes.rb:

match "/404", :to => "errors#not_found"

我从 José Valim 的博客文章“My five favorite hidden features in Rails 3.2”的第 3 项中获得了此信息。

关于ruby-on-rails - Rails 3 中的动态错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331008/

相关文章:

ruby-on-rails-3 - Rails 3 ActiveRecord API - 更改查询以与 Rails 3 配合使用

ruby-on-rails - 在Redmine中测试

c++ - map/unordered_map 插入期间内存分配失败

mysql - 运行所有迁移文件时出现问题。还能做什么?

ruby-on-rails - 在 bundle install 上安装 Nokogiri 时出错但已经安装

ruby-on-rails - Debian 7 和 Ubuntu 上最新版本的 sphinxsearch

java - 如何在 JAX-WS Web 服务上引发自定义错误?

ruby-on-rails - 活跃的管理员自定义 ruby​​ on rails

ruby-on-rails - RailsAdmin for Rails3(带设计)-仅用于管理 View ?

Android:如何正确初始化 YouTube 播放器内部 Activity ?