Rails 路由:将路由上的请求限制为仅一种格式

问题描述 投票:0回答:4

我有以下路线:

resources :tags do
  collection do
    get 'autocomplete', :constraints => { :format => 'js' }
  end
end

我希望它只响应 JS 请求(仅适用于 jQuery 自动完成),对于常规 HTML 请求,我认为它应该是 404 响应,或者至少是重定向。

相反,所有请求都会通过路由转换为 JS 格式,因此 HTML 请求会获取 json 哈希值。

这并不是绝对重要的,但如果我能够彻底限制此路由,以便不允许对它的 HTML 请求,我会更高兴。应该如何处理?

ruby-on-rails routes
4个回答
2
投票

TagsController#autocomplete
中,执行以下操作:

respond_to do |format|
  # format.html { redirect_to some_path } # enable if you want to handle html requests as well
  format.js
end

1
投票

你可以尝试这个(未测试):

get 'autocomplete', :constraints => { :format => 'js' }, :defaults => {:format => nil}

但是,@prusswan 的答案是符合逻辑的方法,而且更明确。保持控制器的精简是一件好事,但保持它们的可读性更好


1
投票

你可以试试这个


  scope format: true, constraints: { format: 'html' } do
    get '/home' => 'home#index'
  end


0
投票

我知道这是一个老问题,但我觉得接受的答案不准确。你想做的是:

get 'autocomplete', constraints: lambda { |req| req.format == :js }

接受的答案正在做:

get 'autocomplete', :constraints => { :format => 'js' }, :defaults => {:format => nil}

但是,如果我想限制为特定格式,我希望请求具有不同格式的资源将返回 404,除非您使用 lambda,否则情况并非如此。 Rails 路由指南中解释了原因。总而言之,除非您使用 lambda,否则键“格式”默认是可选的。

例如,get 'foo',constraints: { format: 'json' } 将匹配 GET /foo 因为默认情况下格式是可选的。但是,您可以使用 类似于 get 'foo' 中的 lambda,约束: lambda { |req|请求格式== :json } 并且路由将仅匹配显式 JSON 请求。

来源:https://guides.rubyonrails.org/routing.html

© www.soinside.com 2019 - 2024. All rights reserved.