2015-11-13 30 views
2

在Rails中,你可以指定一组路由(命名空间内)默认:所有设置默认值Rails的,像这样的路线

Rails.application.routes.draw do 
    # Other routes 

    namespace :api, defaults: { format: :json } do 
    resources :users 
    end 
end 

如何申请这样的默认应用程序中的所有路线?

+0

不知道这是可能的。但是你可以在你的应用程序控制器的'before_action'中设置格式(虽然这不是一样的)。 –

+0

实际上这并不是一个坏主意;我已经有了一个'before_filter',它只允许格式为JSON的请求,但如果没有设置,我可以修改它以将格式设置为JSON。 – DanielGibbs

回答

2

我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 
+0

我只想接受JSON请求,但是对于其他请求格式而不是406,使用'constraint'返回404。虽然我不熟悉'format:true',它看起来就像我想要的,它是做什么的? – DanielGibbs

+0

不知道 - 在其他问题上的家伙似乎认为它运作良好。我认为这意味着你的范围已经启用了'格式',尽管我不得不花一些时间来查看它以确定 –

0

我想你可以使用全局before_action

class ApplicationController < ActionController::Base 
    before_action :set_format 

    def set_format 
    return unless request.format.nil? 
    request.format = :json 
    end 
end 
+0

我不认为这是正确的。 'request.format'是一个MIME类型,如果它已经被设置,它会覆盖它。 – DanielGibbs

+0

我在'set_format'函数中添加了一个nil检查。我认为路由的'defaults'选项是一样的 –

+0

即使未指定格式,request.format不是'nil',而是'text/html'。 – DanielGibbs

1

基于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 
+0

一件小事:'before_filter'弃用'before_action'赞成 –

+0

谢谢;更新。 – DanielGibbs