当滑轨布线资源的可选的格式属性被自动附加到生成的路线。 这是为了让有问题的资源也可要求为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]}
有没有办法实现这个天然或通过插件?
PS解决此通常的方式就是忽视的问题和不使用respond_to
的行动。 但其实这并不限制所允许的内容类型。 相反,它只是期望的模板在每一个可能的内容类型的意见,目录中。 如果在请求时不存在,系统将抛出一个HTTP 500错误。
如果你想将它们限制在一个特定的格式(例如HTML或JSON),必须用一个范围的路由。 不幸的约束如预期在这种情况下不工作。
这是这样一个块的一个例子...
scope :format => true, :constraints => { :format => 'json' } do
get '/bar' => "bar#index_with_json"
end
更多信息可以在这里找到: https://github.com/rails/rails/issues/5548
这个答案是从我以前的答案复制在这里..
Rails的路线-限制了可用格式的资源
由于Rails使用通配符来处理格式相当于“:格式”这有点困难,以防止在路线方面的事情。
取而代之的是,这是很简单的方法来赶在之前过滤任何非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
我相信你是能够做这样的事:
respond_to do |format|
format.html
format.json { render :json => @things }
format.any { render :text => "Invalid format", :status => 403 }
end
如果用户请求HTML或JSON它会做到这一点,因为它应该,但任何东西都不会呈现“无效的格式”文本。
在这两种情况下,你会不会想要一个HTTP 500错误? 就像在你的榜样的第二行,如果有人要求JSON而不是HTML或XML是不是一个错误代码返回适当的响应?
而不是做:
def some_action
...
respond_to do |format|
format.html
format.json { whatever }
format.any { whatever }
end
end
只需使用:
def some_action
...
end
和Rails将默认为寻找some_action.html.erb或任何格式的请求。 如果你没有定义HTML以外的任何意见,那么,如果要求所有其他格式将失败。