Ruby on rails 当用户记录不存在时,如何重定向到404页?

Ruby on rails 当用户记录不存在时,如何重定向到404页?,ruby-on-rails,ruby,redirect,activerecord,url-redirection,Ruby On Rails,Ruby,Redirect,Activerecord,Url Redirection,e、 g我有一个模型(用户模型)。当用户登录帐户时,会发送一封电子邮件,提醒用户其帐户已激活。在这种情况下,如果管理员删除用户记录,然后用户单击电子邮件中的链接以查看其个人资料,则会显示错误。所以,我想检查用户记录是否存在。若它不存在,那个么用户应该被重定向到404页面 我尝试了下面的代码,但它不工作 那么,有解决办法吗 谢谢。非常简单,您只需呈现rails默认404页面或自定义页面 在应用程序控制器中 def content_not_found render file: "#{Rails.

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

我尝试了下面的代码,但它不工作

那么,有解决办法吗


谢谢。

非常简单,您只需
呈现
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
我不喜欢例外情况,我尽量避免它们;)

请尝试以下代码:

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

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

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及以上 如果您想使用application controller,则可以尝试在application controller文件中写入以下两点:

1) 创建渲染404操作:

  def render_404
    respond_to do |format|
      format.html { render file: "#{Rails.root}/public/404.html", status: 404 }
    end
  end
2)
rescue\u from ActiveRecord::RecordNotFound,:with=>:render\u 404操作

当你使用“表演”动作时

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

如果找不到记录(找不到带参数[:id]的用户),则自动将有404条记录。

如果您希望在应用程序级别

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

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

你是说
。通过\u id查找\u
User.find
无论如何都会引发异常,您将无法检查
@User.blank?
@Parinha尝试使用updatead-answer。未定义的方法“empty”表示为nil:NilClass@Gerry您能告诉我如何在应用程序控制器中引发此错误吗?e、 g如果任何记录不存在->它会自动重定向到404页或作为记录未找到而提升到404页。最好是
提升ActiveRecord::RecordNotFound
,因为这是该场景的专用错误。我也希望尽可能避免异常,特别是当它们控制流时。如何将所有不存在的记录重定向到404页?我更喜欢应用程序控制器。
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