【问题标题】:How to make this action throw a 404?如何让这个动作抛出 404?
【发布时间】:2012-03-31 00:26:54
【问题描述】:

我有以下操作:

def show
  @video = @commentable = @favoritable = Video.find_by_key(params[:key])

  Video.increment_counter(:views_count, @video.id)
end

但是现在如果find_by_key 没有找到记录,它会抛出RuntimeError (Called id for nil)。

那么,如果找不到记录,我怎样才能让该操作引发 404?

我正在运行 Rails 3.2.1。

【问题讨论】:

  • 找不到记录的 404?相当用户敌对。
  • @DaveNewton 怎么样?该页面不存在,因为记录不存在......似乎这正是 404 的用途。
  • @DaveNewton Rails 在生产中出现ActiveRecord::RecordNotFound 错误后自动呈现public/404.html 页面。我假设 Shpigford 会自定义该文件,甚至默认的 404.html 页面也会显示“您要查找的页面不存在”的消息。我不确定你想在这里争论什么。
  • @DaveNewton 回到你对这个问题的第一条评论。您期望一条消息说该记录不存在,并且该页面可能会建议替代方案,提供有用的链接等。这正是通用 Rails 404 页面所做的或可以定制的。我什至不确定您所说的“抛出 404”是什么意思,因为每个站点在这些情况下都会通过响应 404 状态码来抛出 404。这也是 seo 原因所期望的。 stackoverflow.com/questions/0 响应 404 状态码。
  • @DaveNewton 你能至少澄清一下“抛出 404”是什么意思吗?当未找到页面/记录时,Stack Overflow 会以 404 状态代码明确响应。

标签: ruby-on-rails ruby-on-rails-3 exception error-handling


【解决方案1】:

在尝试使用 @video.id 的值递增之前添加它。

raise ActiveRecord::RecordNotFound if @video.blank?

或者使用find_by_key 的bang 版本,如果找不到ActiveRecord::RecordNotFound,它将引发。

Video.find_by_key!(params[:key])

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2020-08-16
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多