Chr*_*ele 6 routing ruby-on-rails rails-routing ruby-on-rails-4
对于Reasons™,我想让一个控制器处理html请求,另一个处理json api请求.
我的路线中有这个:
scope module: :api, as: :api do
constraints format: :json do
resources :users
end
end
constraints format: :html do
resources :users
end
Run Code Online (Sandbox Code Playgroud)
当url运行后缀时,这很有用:/users.json通过我的Api::UsersControlleràla api_users_path; /users.html经过我UsersController点菜users_path.
但是,当url中没有后缀时,这不会按预期运行.将约束实现为lambda会显示出错:
#=> visiting /users
scope module: :api, as: :api do
constraints ->(request){ puts "In api: #{request.format}"; request.format == :json } do
resources :users
end
end
constraints ->(request){ puts "In html: #{request.format}"; request.format == :html } do
resources :users
end
#=> In api: text/html
#=> (request.format == :json) => false
Run Code Online (Sandbox Code Playgroud)
然而它最终在api控制器中.
如果没有任何约束匹配,则不会使用自定义约束类或lambdas或任何东西来阻止rails选择定义的第一个路由.
我无法找到一种方法来编写一个在url缺少后缀时捕获的约束,并且request.format == :html当我导航到时,我觉得我不应该 - 报告为真/users.为什么第二个约束没有抓住那个?
此外,虽然我可以通过改变这两个的顺序来"修复"这个,但我更愿意知道为什么我的约束不能正常工作.
有没有人知道如何以不同方式强制执行这些约束以有效地打开任何格式,不仅仅是url后缀,还是有一个不包含格式后缀的显式约束?
将无后缀默认格式设置为 应该json可以满足您的需求。
scope module: :api, as: :api, defaults: { format: :json} do
constraints format: :json do
resources :users
end
end
Run Code Online (Sandbox Code Playgroud)
只有显式 .html 后缀请求才会到达此资源
resources :users
Run Code Online (Sandbox Code Playgroud)