例如,使用config.exceptions_app = self.routes
为Rails设置自定义404 not_found页面并不困难。但是,对于任何404错误(例如ActionController::RoutingError
,AbstractController::ActionNotFound
或AbstractController::RecordNotFound
以及所有操作和控制器,都会呈现自定义视图。如何在一个特定操作(例如用户#show)中仅为ActionController::RecordNotFound
呈现自定义404?我在考虑这样的事情,但看起来很丑陋并且不起作用:
def set_user
@user = User.find_by_something(params[:something]) || render 'errors/not_found'
end
def show
set_user
end
*编辑*
我实际上是通过不发布完整代码来误导回答者;(抱歉。我编辑了我的答案,我们找到了解决方案,看到了接受的答案。
*这也有效但可能不是最好的解决方案*
def set_user
@user = User.find(params[:id])
end
def show
set_user
if @user.nil?
render 'errors/not_found' and return
end
# Code goes here when code 200
end
答案 0 :(得分:1)
def set_user
@user = User.find_by_something(params[:id])
end
def show
begin
set_user
raise ActiveRecord::RecordNotFound if @user.nil?
rescue ActiveRecord::RecordNotFound => e
render 'errors/not_found' and return
end
end
答案 1 :(得分:1)
我知道这个问题很老,但是我认为一个更好的解决方案是使您的UsersController
从错误中解救出来,然后呈现一些自定义错误视图。
因此,请在您的UsersController
中执行以下操作:
rescue_from ActiveRecord::RecordNotFound, with: :render_404
# Your old set_user but raising an error
def set_user
@user = User.find_by_something(params[:something])
raise ActiveRecord::RecordNotFound unless @user
end
private
def render_404
render 'users/not_found', status: '404', layout: 'errors'
end
现在只需在UsersController
上为app/views/users/not_found.html.erb
定义一个自定义错误页面,并在layout: 'errors'
上定义一个自定义布局文件(仅当您设置app/views/layouts/errors.html.erb
时)。