如何限制Rails路由文件中的资源格式

Tho*_*son 13 rest routing content-type ruby-on-rails

在Rails中路由资源时,可选的format属性会自动附加到生成的路由中.这样可以将所讨论的资源请求为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]}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现本机或通过插件?

PS解决此问题的常用方法是忽略该问题,不要respond_to在操作中使用.但这实际上并不限制允许的内容类型.相反,它只是期望视图目录中存在每种可能的内容类型的模板.如果在请求时不存在,则系统将抛出HTTP 500错误.

koo*_*nse 6

如果要将这些路由限制为特定格式(例如html或json),则必须将这些路由包装在作用域中.遗憾的是,在这种情况下,约束条件无法正常工作.

这是这样一个块的一个例子......

scope :format => true, :constraints => { :format => 'json' } do
  get '/bar' => "bar#index_with_json"
end
Run Code Online (Sandbox Code Playgroud)

更多信息可以在这里找到:https://github.com/rails/rails/issues/5548

这个答案是从我之前的答案复制而来的.

Rails Routes - 限制资源的可用格式


Pet*_*net 5

由于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
Run Code Online (Sandbox Code Playgroud)

ActionController :: RoutingErrors被处理为404错误,这是明智的.如果您确实需要支持HTML以外的操作,请使用:

skip_before_filter :check_format, :only => ACTION_NAME
Run Code Online (Sandbox Code Playgroud)


Mik*_*bee 1

无论哪种情况,您都不希望出现 HTTP 500 错误吗?就像示例的第二行一样,如果有人请求 JSON 而不是 HTML 或 XML,错误代码不会返回适当的响应吗?