ruby-on-rails – 如何限制Rails路由文件中的资源格式

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 如何限制Rails路由文件中的资源格式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当在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

猜你在找的Ruby相关文章