在Rails中,你可以指定一组路由(命名空间内)默认:所有设置默认值Rails的,像这样的路线
Rails.application.routes.draw do
# Other routes
namespace :api, defaults: { format: :json } do
resources :users
end
end
如何申请这样的默认应用程序中的所有路线?
在Rails中,你可以指定一组路由(命名空间内)默认:所有设置默认值Rails的,像这样的路线
Rails.application.routes.draw do
# Other routes
namespace :api, defaults: { format: :json } do
resources :users
end
end
如何申请这样的默认应用程序中的所有路线?
我downvoted Yury's
答案,因为它的效率不高。
我原先假定(不正确)你想设置一个constraint
(IE只接受JSON
MIME类型)。如果是这种情况,you'd benefit from this answer:
scope format: true, constraints: { format: 'json' } do
# your routes here
end
既然你希望设置一个default
,我仍然相信Yury's
答案是无效的(你最好在中间件设置MIME类型,而不是控制器)。
因此,也许你可以use the following:
#config/routes.rb
scope format: true, defaults: { format: "json" } do
...
end
我只想接受JSON请求,但是对于其他请求格式而不是406,使用'constraint'返回404。虽然我不熟悉'format:true',它看起来就像我想要的,它是做什么的? – DanielGibbs
不知道 - 在其他问题上的家伙似乎认为它运作良好。我认为这意味着你的范围已经启用了'格式',尽管我不得不花一些时间来查看它以确定 –
我想你可以使用全局before_action
:
class ApplicationController < ActionController::Base
before_action :set_format
def set_format
return unless request.format.nil?
request.format = :json
end
end
我不认为这是正确的。 'request.format'是一个MIME类型,如果它已经被设置,它会覆盖它。 – DanielGibbs
我在'set_format'函数中添加了一个nil检查。我认为路由的'defaults'选项是一样的 –
即使未指定格式,request.format不是'nil',而是'text/html'。 – DanielGibbs
基于Yury Lebedev's answer,我有这个使用before_action
工作。使用此方法时,路线defaults
选项有所不同:request.format
未设置为application/json
,因为它使用的是defaults
。
class ApplicationController < ActionController::Base
before_action :default_format_json
def default_format_json
unless params.key?(:format)
params[:format] = "json"
end
end
end
一件小事:'before_filter'弃用'before_action'赞成 –
谢谢;更新。 – DanielGibbs
不知道这是可能的。但是你可以在你的应用程序控制器的'before_action'中设置格式(虽然这不是一样的)。 –
实际上这并不是一个坏主意;我已经有了一个'before_filter',它只允许格式为JSON的请求,但如果没有设置,我可以修改它以将格式设置为JSON。 – DanielGibbs