我对将路由命名空间限制为格式的众多方法感到有些困惑。我想知道不同方法之间的区别是什么:
将format
选项设置为:
namespace :api, format: 'json'
根据docs:
:格式
允许您指定可选格式段的默认值,或通过提供false来禁用它。
这与在控制器中使用before_action
相同:
before_action :set_format
def set_format
reqeust.format ||= :json
end
在defaults
哈希值中设置格式:
namespace :api, defaults: { format: 'json' }
在constraints
哈希值中设置格式:
namespace :api, constraints: { format: 'json' }
但是,根据Rails指南中Request-Based Constraints部分的第二个注释:
格式约束有一个例外:虽然它是Request对象上的一个方法,但它也是每个路径上的隐式可选参数。段约束优先,格式约束仅在通过哈希强制执行时才应用。例如,获取'foo',约束:{format:'json'}将匹配GET / foo,因为默认情况下格式是可选的。但是,您可以在get'foo'中使用lambda,约束:lambda {| req | req.format ==:json},路由只匹配显式JSON请求。
导致:
在lambda中明确设置格式:
namespace :api, constraints: lambda { |req| req.format == :json }
有人可以解释这四种方法的细微差别吗?
谢谢。