每当出现错误时,我都会覆盖 render_optional_error_file 以呈现自定义页面。如果应用程序中出现错误,这非常有用,它会毫无问题地呈现“shared/error.erb”。
我的应用程序控制器有几个 before_filters 负责设置页面的配色方案、定义菜单项和验证用户。当出现应用程序错误时,它们也会运行,这是需要的。
但是,当呈现文件的 404 页面时,这些过滤器都没有运行,所以我得到一个没有菜单的黑页。有没有办法可以触发这些运行?有什么理由我不应该这样做吗?
每当出现错误时,我都会覆盖 render_optional_error_file 以呈现自定义页面。如果应用程序中出现错误,这非常有用,它会毫无问题地呈现“shared/error.erb”。
我的应用程序控制器有几个 before_filters 负责设置页面的配色方案、定义菜单项和验证用户。当出现应用程序错误时,它们也会运行,这是需要的。
但是,当呈现文件的 404 页面时,这些过滤器都没有运行,所以我得到一个没有菜单的黑页。有没有办法可以触发这些运行?有什么理由我不应该这样做吗?
当 Rails 遇到丢失的文件时,它会在应用程序控制器上以状态 404 运行 render_optional_error_file(404),但会跳过所有过滤器,可能是因为已经发生错误。
我向我的应用程序控制器添加了一个名为 run_filters 的方法,然后从 render_optional_error_file 调用它:
def run_filters
#run filters or whatever
end
def render_optional_error_file(status)
run_filters
render "shared/error", :status => status
end
You can also test this behaviour on your development server by including the following in your application controller:
alias_method :rescue_action_locally, :rescue_action_in_public
好吧,您可能需要考虑为您的错误页面创建一个特殊的布局。毕竟,使错误页面与正常页面明显区分开来是一种常见的做法。
但我不明白为什么您在应用程序控制器中定义的之前的过滤器不会触发。它们确实应该在您的操作发生任何错误之前触发。您能否向我们提供一些来自您的应用程序控制器的代码?