【发布时间】:2013-10-19 23:43:32
【问题描述】:
For 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
当 url 带有后缀时,这很有效:/users.json 通过我的 Api::UsersController à la api_users_path; /users.html 通过我的UsersController à la 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
但它最终出现在 api 控制器中。
如果没有任何约束匹配,则不要摆弄自定义约束类或 lambdas 或任何东西来阻止 rails 选择定义的第一个路由。
我找不到编写约束条件的方法,该约束条件可以在 url 缺少后缀时捕获,而且我觉得我不应该这样做——当我导航到 /users 时,request.format == :html 报告为真.为什么第二个约束没有捕捉到这一点?
另外,虽然我可以通过改变这两个的顺序来“解决”这个问题,但我更想知道为什么我的约束不能正常工作。
有谁知道如何以不同的方式强制执行这些约束以有效地打开任何格式,而不仅仅是 url 后缀,或者有一个不包含格式后缀的显式约束?
【问题讨论】:
-
第二个约束无法捕捉到路由不匹配
-
为什么不简单地为您的 api 中的所有操作设置请求格式?
-
实际上,既然你命名了你的控制器,我不明白你为什么需要路由约束
-
我正在尝试按格式进行路由。除了防止链接助手(api_users_path vs users_path)的名称空间冲突之外,命名空间对此没有任何影响,因为这些路由除了约束之外是相同的。有没有办法在我的问题中澄清这个意图?
-
哦,明白了,你放了一个模块但没有命名空间!好的,所以我总是帮不了你,但我的 api 在
api.或/api
标签: ruby-on-rails routing ruby-on-rails-4 rails-routing