gpt4 book ai didi

ruby-on-rails - 了解 Rails 中的约束

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:44 25 4
gpt4 key购买 nike

我一直在进行测试,以确保某些 CRUD 操作无法根据此资源声明在我的应用程序中路由

resources :posts, only: [:index, :show] do
resources :categories
end

我的 Rspec Controller 测试

it 'does not route to #new' do
expect(get: '/posts/new').to_not be_routable
end

当我运行这个测试时,我得到以下输出

expected {:get=>"/posts/new"} not to be routable, but it routes to {:controller=>"posts", :action=>"show", :id=>"new"}

经过一些研究,我发现了 this在 SO 上发帖,阅读它并使用约束实现解决方案。

resources :posts, only: [:index, :show], except: :new, constraints: { id: /\d+/ } do
resources :categories
end

现在我的测试通过了,但我不明白为什么,不能在不理解的情况下离开它。所以我有两个问题

  1. 为什么测试一开始就失败了?
  2. 添加约束参数是如何修复它的?

最佳答案

根据您链接的帖子和您实现的答案,

两者的区别

'/posts/new' # which is the route to the new action of post controller

'/posts/:id' #which is the route to the show action of the same controller

几乎什么都没有,除了一个是 /new 和另一个是 /:id

现在,这种差异几乎没有,因为有一个像 /posts/:id 这样的路由意味着这里唯一真正需要的是 /posts/ 部分.在此之前的任何其他内容都将被视为 /posts/:idid

为此,/posts/5, /posts/10, /posts/you, /posts/me ,甚至 /posts/new 都匹配 /posts/:id:id 分别等于 => 5、10、你、我、新。

以上是您的测试失败的原因,因为转到 /posts/new 是 show 操作的路由,它本质上是 /posts/:id

另一方面,当您添加约束 ( id:/\d+/) 时,您是在告诉路由 id 应该是严格的数字。这将防止任何不是数字的字符被解释为 id,因此,在上面的示例中,( /posts/5, /posts/10/posts/you/posts/me,甚至/posts/new),只有posts/5/posts/10 将匹配 show Action ,而其余的则不会。

希望这是很好的解释......

关于ruby-on-rails - 了解 Rails 中的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33753167/

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