Rails控制器/操作特定404未找到视图

时间:2015-08-18 14:13:16

标签: ruby-on-rails

例如,使用config.exceptions_app = self.routes为Rails设置自定义404 not_found页面并不困难。但是,对于任何404错误(例如ActionController::RoutingErrorAbstractController::ActionNotFoundAbstractController::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

2 个答案:

答案 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时)。