如果用户记录不存在,如何重定向到404页面?

时间:2017-05-30 04:05:56

标签: ruby-on-rails ruby redirect activerecord url-redirection

例如我有一个模型(用户模型)。当用户注册帐户时,会发送一封电子邮件,提醒用户他/她的帐户已被激活。在这种情况下,如果管理员删除用户记录,然后用户单击电子邮件中的链接以查看他或她的个人资料,则会显示错误。所以,我想检查用户记录是否存在。如果它不存在,则应将用户重定向到404页面。

我已尝试过以下代码,但无效。 this is the following example that i have tried

def show
  @user = User.find(params[:id]) or raise ActionController::RoutingError.new('Not Found')
end

那么,有解决方案吗?

感谢。

5 个答案:

答案 0 :(得分:5)

这非常简单,您只需要render rails默认404页面或您自定义的页面。

在您的应用程序控制器中,

def content_not_found
  render file: "#{Rails.root}/public/404", layout: true, status: :not_found
end

然后,从您希望的任何控制器中调用它。在你的情况下,

def show
  if (@user = User.find_by_id(params[:id]).present?
    # do your stuff
  else
    content_not_found
  end
end

我不喜欢异常,我尽量避免使用它们;)

答案 1 :(得分:3)

请尝试使用此代码:

def show
  @user = User.find_by(id: params[:id])

  raise ActionController::RoutingError.new('Not Found') if @user.blank?
end

答案 2 :(得分:2)

试试这个:

def show
  if (@user = User.find_by_id(params[:id])).present?
    @user = User.find(params[:id])
    authorize @user
  else
    raise ActionController::RoutingError.new('Not Found')
  end
end

答案 3 :(得分:0)

您也可以使用

Rails 3及以上

render :file => "#{Rails.root}/public/404.html",  :status => 404

如果您想使用应用程序控制器,那么您可以尝试在应用程序控制器文件中编写以下两点:

1)创建render_404动作:

  def render_404
    respond_to do |format|
      format.html { render file: "#{Rails.root}/public/404.html", status: 404 }
    end
  end

2)rescue_from ActiveRecord::RecordNotFound, :with => :render_404 action

当你正在使用' show'动作

def show
  @user = User.find_by(id: params[:id])
end

如果没有找到记录(没有找到使用params [:id]的用户),则自动会有404。

答案 4 :(得分:0)

如果你想要应用程序级别......

在应用程序控制器中,添加以下内容......

rescue_from ActionController::RoutingError, :with => :render_404

def render_404
  render :file => "#{Rails.root}/public/404.html",  :status => 404
end

在用户控制器中,您可以说,

def show
  @user = User.find(params[:id])
end

如果您只想在单一控制器级别进行此操作,

在用户控制器中,执行以下操作

def show
  @user = User.find(params[:id])
rescue ActionController::RoutingError
  raise ActionController::RoutingError.new('Not Found')
end