如何限制在Rails的路由文件中的资源格式(How to limit the resource fo

2019-08-03 15:23发布

当滑轨布线资源的可选的格式属性被自动附加到生成的路线。 这是为了让有问题的资源也可要求为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错误。

Answer 1:

如果你想将它们限制在一个特定的格式(例如HTML或JSON),必须用一个范围的路由。 不幸的约束如预期在这种情况下不工作。

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

scope :format => true, :constraints => { :format => 'json' } do
  get '/bar' => "bar#index_with_json"
end

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

这个答案是从我以前的答案复制在这里..

Rails的路线-限制了可用格式的资源



Answer 2:

由于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


Answer 3:

我相信你是能够做这样的事:

respond_to do |format|
  format.html
  format.json { render :json => @things }
  format.any { render :text => "Invalid format", :status => 403 }
end

如果用户请求HTML或JSON它会做到这一点,因为它应该,但任何东西都不会呈现“无效的格式”文本。



Answer 4:

在这两种情况下,你会不会想要一个HTTP 500错误? 就像在你的榜样的第二行,如果有人要求JSON而不是HTML或XML是不是一个错误代码返回适当的响应?



Answer 5:

而不是做:

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以外的任何意见,那么,如果要求所有其他格式将失败。



文章来源: How to limit the resource formats in the Rails routes file