gpt4 book ai didi

ruby-on-rails - Rails 路由 : format constraints when none is specified

转载 作者:行者123 更新时间:2023-12-04 06:34:45 26 4
gpt4 key购买 nike

对于 Reasons™,我想让一个 Controller 处理 html 请求,另一个处理 json api 请求。

我的 route 有这个:

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 Controller 中。

如果没有任何约束匹配,则无需摆弄自定义约束类或 lambdas 或任何东西会阻止 Rails 选择定义的第一条路线。

我找不到一种方法来编写在 url 缺少后缀时捕获的约束,而且我觉得我不应该这样做– request.format == :html当我导航到 /users 时报告为真.为什么第二个约束没有捕获这一点?

另外,虽然我可以通过改变这两个的顺序来“修复”这个问题,但我更想知道为什么我的约束不能正常工作。

有谁知道如何以不同的方式强制执行这些约束以有效地打开任何格式,而不仅仅是 url 后缀,或者有一个不包含格式后缀的显式约束?

最佳答案

我认为您不需要第二个约束块(用于 :html 的那个)。我认为这应该做你想做的:

scope module: :api, as: :api do
constraints format: :json do
resources :users
end
end

resources :users

关于ruby-on-rails - Rails 路由 : format constraints when none is specified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19325844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com