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错误.
如果要将这些路由限制为特定格式(例如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使用相当于通配符来处理格式".: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)
| 归档时间: |
|
| 查看次数: |
7438 次 |
| 最近记录: |