在许多情况下,人们希望有单独的错误页面,但在我的情况下,我想要在我的主页上有一个自定义错误页面。
我发现链接http://makandracards.com/makandra/12807-custom-error-pages-in-rails-3-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>