丢失映像文件时出现内部服务器错误500(Rails 3.2.12)
如果我们请求伪造镜像文件,Rails会生成内部500服务器错误而不是404。请参阅下面的日志。丢失映像文件时出现内部服务器错误500(Rails 3.2.12)
这里是routes.rb中映入404行:
# Catches all 404 errors and redirects
match '*url' => 'default#error_404'
其他未知的URL与404正确处理。带有文件扩展名的图像文件和网址有什么不同?
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"
的问题是,Default
控制器内的error_404
方法无法处理PNG格式的请求。当你问说,一个JSON响应,你可以建立类似的网址:
/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格式)以用于任何其他类型的请求。
希望它能帮助:)
什么是DefaultController
?该控制器是处理404,而不是Rails的默认响应:
ActionController::RoutingError (No route matches [GET] "/images/doesnotexistyo.png"):
因此,找出该控制器,正在执行error_404并没有模板默认/ error_404被发现,因此500错误。
你可能有类似这样的地方在你的代码的代码:
rescue_from ActiveRecord::RecordNotFound, :with => :error_404
我们用路线中的一条线更新了q。rb,它捕获了404。问题是为什么它对一些URL有效,而不是对文件扩展名(特别是图像)有效? – Crashalot 2013-03-08 19:45:35
方法error_404的内容是什么?该方法到达了最后,并试图用erb或builder渲染视图,使用提供的格式:png。除非你有一个error_404.png.erb或error_404.png.builder,否则你会看到这个错误的方式现在应用程序的设置。 – Leito 2013-03-08 19:48:53
啊,我明白了。在3.2.12中处理这个问题的正确方法是什么?回答你的问题,error_404是一个空的行为,只是呈现相应的.html.erb视图。 – Crashalot 2013-03-08 19:54:44
也许不适合你,但因为我在我的控制器动态网页一些最后的检查,我只是按照我的所有404'ing一个处理非HTML文件:
format.all { render :status => 404, :nothing => true }
谢谢!如果它不是HTML格式,我们可以强制它呈现HTML视图并显示正确的404页面吗? – Crashalot 2013-03-08 20:30:53
编辑我的答案,希望它有帮助:D – sergelerator 2013-03-08 22:26:38
我们如何设置一个全面的?换句话说,如果我们想要捕获任何文件扩展名(例如.jpg,.gif)而不单独指定每个文件扩展名,我们将如何处理它? – Crashalot 2013-03-11 03:56:58