Rails 5.1如何返回404状态码且不渲染页面?
解决Rails 5.1中返回404时不渲染当前模板的问题
这个问题我之前也碰到过!Rails里单纯设置render status: 404的时候,它默认还是会尝试渲染当前动作对应的模板(也就是你的index.html.erb),这就是为什么你会遇到模型属性缺失的错误。下面给你两种符合需求的解决方案:
方案1:仅返回404状态码,不返回任何响应内容
如果你的需求是只给客户端返回404的HTTP状态,不需要任何页面内容,直接用head方法就可以了——它只会发送HTTP状态头,不会渲染任何模板:
def index if worker # 你的正常业务逻辑 else puts "page not found" head :not_found # 也可以直接写 `head 404`,效果完全一致 end end
方案2:返回Rails默认的404错误页面
如果你其实是想展示Rails自带的public/404.html页面(而不是当前的index模板),可以这样写:
def index if worker # 你的正常业务逻辑 else puts "page not found" render file: Rails.public_path.join('404.html'), status: :not_found, layout: false end end
另外还有一种更“Rails风格”的方式:主动抛出记录不存在的异常,让Rails的异常处理机制自动返回404页面:
def index if worker # 你的正常业务逻辑 else puts "page not found" raise ActiveRecord::RecordNotFound end end
不过要注意,这种方式在开发环境下会显示错误栈信息,只有在生产环境(需确保config/environments/production.rb中config.consider_all_requests_local = false)才会显示公共的404页面。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

