当在Rails中路由资源时,可选格式属性将自动附加到生成的路由.这样就可以将所讨论的资源请求为
XML,HTML等.实际允许的格式通常在控制器中使用respond_to进行描述.
但是在许多情况下,您只需要支持HTML,并且在每个控制器的每个动作中写入respond_to:html就像一个开销.因此,如果在routes.rb文件中构建路由时已经有一种方法来限制允许的内容类型,那么这将是很酷的.
map.resources :users,:formats => :html map.resources :users,:formats => [:html,:xml] map.resources :users,:formats => {:index => :html,:show => [:html,:xml]}
有没有办法通过本机或通过插件来实现?
附:解决这个问题的通常方法是忽略这个问题,不要在actions中使用respond_to.但这实际上并不限制允许的内容类型.相反,它只是期望在每个可能的内容类型的views目录中存在一个模板.如果请求不存在,则系统将引发HTTP 500错误.
解决方法
由于Rails使用等价于通配符来处理格式“.:format”,所以在路由方面阻止某些事情有点困难.
而不是这样,在前一个过滤器中捕获任何非HTML请求是非常简单的方法.这可能是一种方式:
class ApplicationController < ActionController::Base before_filter :check_format private def check_format if request.format != Mime::HTML raise ActionController::RoutingError,"Format #{params[:format].inspect} not supported for #{request.path.inspect}" end end end
ActionController :: RoutingErrors被处理为404错误,这是明智的.
如果您确实有需要支持HTML以外的操作,请使用:
skip_before_filter :check_format,:only => ACTION_NAME