在主页上创建自定义Rails错误部分

时间:2014-06-17 08:19:42

标签: ruby-on-rails ruby-on-rails-3 error-handling

在许多情况下,人们希望有单独的错误页面,但在我的情况下,我想要在我的主页上有一个自定义错误页面。

我发现链接http://makandracards.com/makandra/12807-custom-error-pages-in-rails-3-2这有助于制作单独的错误页面。

2 个答案:

答案 0 :(得分:2)

我已经对此进行了广泛的工作,并创建了gem called exceptions_handler以便人们更轻松地使用

你可以看到一个很好的教程here

我还写了详尽的答案here

-

<强> exceptions_app

带有您自己的错误页面的底线是使用Rails中的exceptions_app中间件挂钩捕获错误:

  

config.exceptions_app设置发生异常时ShowExceptionmiddleware调用的异常应用程序。默认为ActionDispatch::PublicExceptions.new(Rails.public_path)

第一个答案已发布,您应该将此应用于config/application.rb,但我不同意直接将请求发送到路径文件

-

<强>控制器

更好的方法是将请求发送到控制器操作(我们使用exceptions#show):

#config/application.rb
config.exceptions_app = ->(env) { ExceptionController.action(:show).call(env) }

#app/controllers/exception_controller.rb
class ExceptionController < ActionController::Base

    #Response
    respond_to :html, :xml, :json

#Dependencies
before_action :status

    def show
       render "index"
    end

    private

    def status
      @exception  = env['action_dispatch.exception']
      @status     = ActionDispatch::ExceptionWrapper.new(env, @exception).status_code
      @response   = ActionDispatch::ExceptionWrapper.rescue_responses[@exception.class.name]
    end

end

-

<强>视图

这将允许您创建以下视图:

#app/views/application/index.html.erb
<% render partial: "errors" if @status.present? %>

答案 1 :(得分:0)

所以我已经做了以下事情来帮助解决这个问题:

<强> routes.rb中:

  match '/404', :to => 'home#not_found'
  match '/422', :to => 'home#rejected'
  match '/500', :to => 'home#server_error'

<强> application.rb中

config.exceptions_app = self.routes

<强> Home_controller.rb

  def not_found
    @errors = I18n.t("home.errors.error_404")
    render 'index'
  end

  def rejected
    @errors = I18n.t("home.errors.error_422")
    render 'index'
  end

  def server_error
    @errors = I18n.t("home.errors.error_500")
    render 'index'
  end

在我的主页/索引页面:

<%= render :partial => 'errors', :errors => @errors %>

简单的部分_errors:

<div class="row">
  <% if @errors %>
  <div class="alert alert-wide alert-info">
    <p style="display:inline"><%= @errors %></p>
</div>
<% end %>
</div>