缺少图像文件时出现内部服务器错误500(Rails 3.2.12)

时间:2013-03-08 19:00:56

标签: ruby-on-rails actionview

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

以下是 routes.rb 中捕获404s的行:

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

使用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"

3 个答案:

答案 0 :(得分: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

干杯:)

<强> EDIT2

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

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格式)。

希望有所帮助:)

答案 1 :(得分:0)

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

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

因此找出这个控制器,正在执行error_404并且没有找到模板默认/ error_404,因此出现500错误。

您的代码中可能有一个与此类似的代码:

rescue_from ActiveRecord::RecordNotFound, :with => :error_404

答案 2 :(得分:0)

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

format.all { render :status => 404, :nothing => true }