6

如果我们请求伪造的图像文件,Rails 会生成内部 500 服务器错误而不是 404。请参阅下面的日志。

这是routes.rb中捕获 404 的行:

# Catches all 404 errors and redirects
match '*url' => 'default#error_404'

其他未知 URL 使用 404 正确处理。图像文件和带有文件扩展名的 URL 有什么不同?

Started GET "/images/doesnotexistyo.png" for 71.198.44.101 at 2013-03-08 07:59:24 +0300
Processing by DefaultController#error_404 as PNG
  Parameters: {"url"=>"images/doesnotexistyo"}
Completed 500 Internal Server Error in 1ms

ActionView::MissingTemplate (Missing template default/error_404, application/error_404 with {:locale=>[:en], :formats=>[:png], :handlers=>[:erb, :builder]}. Searched in:
  * "/home/prod/Prod/app/views"
4

3 回答 3

4

问题是控制器error_404内部的方法Default无法处理 png 格式的请求。当您要求 JSON 响应时,您可以构建一个类似于以下内容的 URL:

/controller/action.json

在动作里面你会有类似的东西

def action
  respond_to do |format|
    format.html # Renders the default view
    format.json { render :json => @model }
    format.xml { render :xml => @model }
  end
end

如您所见,它指定了如何处理 JSON 和 XML 请求,但是由于没有format.png,因此该操作无法处理.png格式。添加这个:

format.png # Handle the request here...

希望能帮助到你 :)

编辑

添加此重定向到您的 404 处理程序:

def error_404
  respond_to do |format|
    format.html
    format.png { redirect_to :controller => 'default', :action => 'error_404' }
  end
end

干杯:)

编辑2

使用此代码捕获各种请求:

def error_404
  respond_to do |format|
    format.html { render :not_found_view }
    format.all { redirect_to controller: 'default', action: 'error_404' }
  end
end

替换:not_found_view为您的 404 页面。这将为 html 请求呈现 404 页面,并为任何其他类型的请求重定向到 self(使用 html 格式)。

希望能帮助到你 :)

于 2013-03-08T19:59:36.653 回答
0

是什么DefaultController?该控制器正在处理 404,而不是 Rails 的默认响应:

ActionController::RoutingError (No route matches [GET] "/images/doesnotexistyo.png"):

所以找出这个控制器,error_404 正在执行,没有找到模板 default/error_404,因此出现 500 错误。

您可能在代码中的某处有类似的代码:

rescue_from ActiveRecord::RecordNotFound, :with => :error_404
于 2013-03-08T19:43:01.677 回答
0

也许不适合你,但由于我在控制器中动态地对页面进行了一些最终检查,所以我只需按照我的所有 404'ing 来处理非 html 文件:

format.all { render :status => 404, :nothing => true }
于 2014-09-29T23:23:47.163 回答